Вы находитесь на странице: 1из 49

FEPI Colgio Universitas

Introduo a Lgica de Programao

ALGORTMOS
INTRODUO A LGICA DE PROGRAMAO

1 - INTRODUO E DEFINIO 1.1 Introduo a Lgica de Programao um mtodo pelo qual se aplica o fundamento do Raciocnio Lgico em desenvolvimento de programas de computador, fazendo uso ordenado dos elementos bsicos suportados por um dado estilo de programao. Usar o Raciocnio Lgico no desenvolvimento de programas consiste em: Ler atentamente o enunciado Retirar do enunciado a relao das entradas de dados Retirar do enunciado a relao das sadas de dados Determinar as aes que levaro a atingir o resultado desejado

Informao
1.2 Algoritmos

Ao

Resultado

Podemos pensar num algoritmo como um mecanismo de transformao de entradas em sadas. Assim, um algoritmo ao ser executado, receber algumas entradas, que sero processadas e nos devolver sadas esperadas.

FARINHA

+
ACAR

ENTRADA / DADOS LEITE

AO / PROCESSAMENTO

SADA / RESULTADO

ALGO: Lgica

RTMO: Estudo

ALGORTMO = ESTUDO DA LGICA

Aplicao computacional do Estudo da Lgica para se alcanar um objetivo. Linguagem em alto nvel que permite ao usurio/programador preparar e programar o computador para resolver problemas atravs de uma seqncia lgica de aes que devero ser executados passo-a-passo e que seguiro os conceitos da programao estruturada. Um algoritmo um texto esttico, onde temos vrios passos que so 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 dinmico. No fluxo de controle identificamos em cada passo da execuo qual o prximo comando a ser executado.
Prof. Cristiano Vieira Copyright 2004 Pgina - 1 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

A compreenso da lgica de programao de um algoritmo est diretamente ligada a compreenso de seu fluxo de controle. A partir de uma compreenso correta, podemos traar as diversas execues possveis de um algoritmo. Se testarmos todas essas possibilidades, e obtivermos resultados corretos, podemos ter certeza de estar entregando um produto final confivel.

Antes de escrever um algoritmo que dever atingir uma soluo, devese conhecer profundamente o problema em questo e tambm planejar como se deve resolve-lo.

Exemplo de uma soluo para um problema: Problema em questo: TRABALHAR Ponto de Partida: DORMINDO Soluo em linguagem natural (alto nvel ) 1. ACORDAR Ponto de partida do 2. SAIR DA CAMA problema 3. IR AO BANHEIRO 4. LAVAR O ROSTO E ESCOVAR OS DENTES 5. COLOCAR A ROUPA 6. SE CHOVER, ENTO USAR GUARDA-CHUVA, SENO USAR BON 7. IR AO PONTO DE ONIBUS 8. ANDAR DE ONIBUS AT ELE CHEGAR AO SERVIO 9. BATER O CARTO DE PONTO Obteno 10. COMEAR O EXPEDIENTE
da soluo

1.3 Mtodo para desenvolvimento de algoritmos 1. Faa uma leitura de todo o problema at o final, a fim de formar a primeira impresso. A seguir, releia o problema e faa anotaes sobre os pontos principais. Verifique se o problema foi bem entendido. Questione, se preciso, ao autor da especificao sobre suas dvidas. Releia o problema quantas vezes for preciso para tentar entend-lo. Extraia do problema todas as suas entradas (informaes, dados). Extraia do problema todas as suas sadas (resultados). Identifique qual o processamento principal. Verifique se ser necessrio algum valor intermedirio que auxilie a transformao das entradas em sadas. Esta etapa pode parecer obscura no incio, mas com certeza no desenrolar do algoritmo, estes valores aparecero naturalmente. Teste cada passo do algoritmo, com todos os seus caminhos para verificar se o processamento est gerando os resultados esperados. Crie valores de teste para submeter ao algoritmo. Reveja o algoritmo, checando as normas de criao.

2.

3. 4. 5. 6.

7. 8. 9.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 2 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

1.4 O Pseudocdigo ou Portugus Estruturado ou Portugol uma linguagem natural e informal que ajuda os programadores a desenvolver o algoritmo a fim de se comunicar com a mquina. Consiste principalmente na utilizao de uma seqncia estruturada de aes. 1.5 O Fluxograma ou Diagrama de Bloco a utilizao de smbolos pr-definidos para representar o fluxo de dados durantes a execuo dos procedimentos.

Inicio e Fim

Fluxo de dados

Sentenas e Comandos

Conectores de fluxos

Estrutura de Seleo

Estruturas de Repetio

Processo Alternativo

2. Estrutura de Controle Tambm conhecida como programao estruturada. Divide-se em 3 estruturas: 2.1 Seqencial Esta estrutura no so independentes, 2.2 Seleo ou Condicional por isso interagem entre si 2.3 Repetio . 2.1 Programao Estruturada Seqencial Uma programao seqencial aquela cujas aes so executadas uma aps a outra (TOP-DOWN) e identificadas pelo incio e fim de cada bloco de instrues. Exemplo de Programao Seqencial:
INIC

INICIO {Corpo do Algoritmo}


Instrues

Inicio do bloco

FIM

Fim do bloco
FLUXOGRAMA

sempre importante utilizar tcnicas de parametrizao e identao na hora de se escrever os algoritmos. Isto facilita na leitura de seus procedimentos e melhor apresenta sua organizao.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 3 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

A Programao Estruturada definida por uma seqncia de aes que seguem a seguinte composio: 2.1.1 Constantes e Variveis 2.1.2 Smbolos 2.1.3 Operadores 2.1.4 Funes 2.1.5 Comandos 2.1.6 Sentenas 2.1.1 Constantes e Variveis Constantes - Vaz referncias a dados que no sofrem alteraes ao longo do algoritmo. Variveis - Vaz referncias aos dados do problema e que devero ser armazenadas na memria do computador e sofrem alteraes ao longo do algoritmo. Toda varivel deve ser classificada a um tipo exclusivo de informao pela qual a memria da mquina ser preparada para armazenar o dado, e este tipo ser includo j no inicio dos procedimentos. Modelo de uma Clula de Memria X Inteiro ... ... Nome: X .... Tipo: Inteiro ...... Contedo: 10 Endereo: AFC105 AFC105

10

Modelo de armazenamento de variveis na memria do computador

Composio de uma varivel Nome da Varivel: Nome que ser utilizado para identificar a informao e determinar onde a mesma se encontra na memria Tipo de dados: INTEIRO Dados numricos com valores inteiros. Ex. IDADE REAL Dados numricos e que suportam casas decimais. Ex. ALTURA, PESO CARACTER Dados texto (conjunto de caracteres no numricos ou para fins numricos ) Ex. NOMES, ENDERECOS, CEP, PALAVRAS. DIMENSIONADAS Conjunto dinmico de dados armazenados em forma de tabelas ou seqncias limitadas homogneas (VETORES e MATRIZES) ou heterogneas (CAMPOS e REGISTROS) LGICOS Assumem valores nicos e distintos: V (verdade), F (falso). Tabela de Operadores Lgicos VeV=V V ou V = V no V = F VeF =F V ou F = V no F = V FeV =F F ou V = V FeF =F F ou F = F

Contedo: Valor atribudo varivel e que ser colocado na memria.

Endereo: Endereo fsico de armazenamento que ser gerenciado pelo sistema operacional do computador e este evitar que outras informaes invadam a rea restrita a uma varivel

Prof. Cristiano Vieira

Copyright 2004

Pgina - 4 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Declarao das Variveis: A declarao dada sempre no topo do algoritmo. Exemplo: INICIO INTEIRO A, X, idade; REAL peso, L; CARACTER nome, cep, K; LOGICO resposta; VETOR notas[10]; FIM.

2.1.2 Smbolos Representao por smbolos que o computador identifica e interpreta a fim de satisfazer um procedimento. Os principais e mais utilizados so: atribuio de dados a variveis incio de um conjunto dados fim de um conjunto de dados inicio e fim de uma expresso caracter comentrio terminadores de linhas de instrues fim do algoritmo separador de conjunto de dados

( ) // ; . ,

Exemplo: INICIO // variveis INTEIRO A, X, idade; REAL peso, L; CARACTER nome, cep, K; LOGICO resposta; // principal 5; A Peso 65.4; FEPI ; nome falso; resposta FIM.

2.1.3 Operadores Smbolos aritmticos que geram processamento e retornam resultados. So classificados em:
Prof. Cristiano Vieira Copyright 2004 Pgina - 5 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Aritmticos (clculos e processamentos) Descrio Adio Subtrao Multiplicao Diviso (resultado ser um nmero real) Exponenciao Exemplo 10 + 15 20 10 3*5 5/2 5 ^ 2 ou 5**2 Resultado 25 10 15 2,5 25

Operador + * / ^, **

Relacionais (equivalncia ou igualdade entre dois ou mais valores) Descrio Igualdade Maioridade Menoridade Maioridade e Igualdade Menoridade e Igualdade Diferenciao Exemplo 10 = 15 10 > 15 10 < 15 10 >= 15 10 <= 15 10 <> 15 Resultado Falso Falso Verdade Falso Verdade Verdade

Operador = > < >= <= <>

Exemplos de uso: INICIO // variveis INTEIRO A, B, C; // principal A 5; B 4; C A + B; C > A; B = A; A <> B; FIM. 2.1.4 Funes Rotinas matemticas prontas no processador que geram processamento sobre um determinado valor especificado e retornam resultados. Principais funes: SEN(x) retorna o seno do valor especificado entre os parentes COS(x) retorna o cosseno do valor especificado entre os parentes MOD(x) retorna a o resto da diviso de um valor especificado por parentes ABS(x) retorna o valor absoluto do valor especificado entre os parentes SQRT(x) retorna a raiz quadrada do valor especificado entre os parentes

( condio verdadeira ) ( condio falsa ) ( condio verdadeira )

Exemplos de uso: INICIO // variveis INTEIRO A, B, C; // principal A 25; B -4; SQRT(A); C C ABS(B); FIM.
Prof. Cristiano Vieira

(c =5) (c =4)
Copyright 2004 Pgina - 6 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

2.1.5 Comandos Palavras chaves ou instrues pr-definidas que so interpretadas pelo processador e passam produzir iteraes entre o usurio e a mquina. Principais comandos: Exemplo INICIO // variveis INTEIRO A, B, C; // principal Leia(A); Escreva( Informe um valor para varivel B: ); Leia(B); C A / B; Escreva(A); Escreva( Resultado da diviso = , C); Imprima( O resultado da diviso de ,A, por , B, ,C); FIM. 2.1.6 Sentenas a mistura das todas as estruturas afim de se obter um resultado ou uma soluo para um problema. Formam uma sentena o conjunto de regras, comandos, variveis, funes e smbolos, agrupados de forma lgica permitindo que o computador possa processar e interagir com os dados. Exemplo INICIO // variveis INTEIRO A, B, C; // principal Leia(A); Leia(B); C A / ABS(B); Escreva( o valor de C : , C); FIM. LEIA(x) permite ao usurio informar um valor para a varivel durante a execuo do algoritmo ESCREVA(x) mostra na tela do computador o valor da varivel em questo IMPRIMA(x) envia para impressora o valor da varivel em questo

Todas linhas de aes por mais simples que sejam, formam uma sentena.

Lista de exerccios...

Entregar em: ______/______/_______

Prof. Cristiano Vieira

Copyright 2004

Pgina - 7 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

2.2 Programao Estruturada de Seleo ou Condicional Uma estrutura de Seleo ou Condicional aquela cujas aes so determinadas por uma verificao de entrada. Uma anlise de condio ser posta em questo e o computador atravs de um processamento de dados contidos na memria reconhecer se a condio verdadeira ou falsa e assim determinar quais aes sero executadas. Existem 3 tipos de estruturas de seleo: 2.2.1 Seleo Simples (SE-ENTO) 2.2.2 Seleo Composta (SE-ENTO-SENO) 2.2.3 Seleo Mltipla (CASO) 2.2.1 Seleo Simples ou nica (SE ENTO): O bloco de instrues somente ser executado se a verificao de entrada for verdadeira, caso isto no ocorra, o bloco condicional no ser executado. Pseudocdigo: INICIO Fluxograma:
INIC

{Condio (V ou F)} (f ) (v) Ento

f
SE

Instrues

{Aes para Verdadeiro}

{Fim do bloco Condicional}

FIM

Exemplo Prtico: (utilizando o portugus estruturado)

a.

Ir para escola Procurar minha agenda Se (encontrar a agenda) Ento Lev-la para escola Fim Se Pegar o nibus Chegar na escola

b.

Ir a um baile Chegar a portaria do clube Mostrar a identidade Se (idade menor que 18 anos) Ento Apresentar acompanhante Fim Se Entrar no baile Curtir a festa

Prof. Cristiano Vieira

Copyright 2004

Pgina - 8 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Exemplo Prtico: (utilizando algoritmo)

a.

Inicio // variveis inteiro idade; caracter resposta; // principal Escreva(Informe a idade); Leia(idade); Se (idade >= 18) Ento Resposta Maioridade; Escreva(resposta); Fim se; Fim.

b.

Inicio // variveis inteiro idade; caracter resposta; // principal Escreva(Informe a idade); Leia(idade); Se (idade>10) e (idade<30) Ento Resposta Jovem; Escreva(resposta); Fim se; Fim.

c.

Inicio // variveis inteiro idade; caracter resposta; // principal Escreva(Informe a idade); Leia(idade); Se (idade=70)ou (idade=80) Ento Resposta 3 idade; Escreva(resposta); Fim se; Fim.

d.

Inicio // variveis inteiro idade; caracter resposta; // principal Escreva(Informe a idade); Leia(idade); Se ((idade>1) e (idade<9)) ou (idade<1) Ento Resposta Criana; Escreva(resposta); Fim se; Fim.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 9 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

2.2.2 Seleo Composta e/ou Seleo Dupla (SE ENTO SENO) neste caso passa a existir mais de um bloco de instrues porm apenas um ser executado, e isto se dar pelo resultado obtido na verificao de entrada. Quando esta verificao resultar em caminhos distintos para verdadeiro ou para falso, chamamos de Seleo Dupla, mas quando na verificao existir vrias possibilidades de respostas ento a chamamos de composta. Modelo de Seleo Dupla Pseudocdigo: INICIO Fluxograma:
INIC

{Condio (V ou F)} (v) Ento {Aes para Verdadeiro} (f) Seno {Aes para Falso}

(f) seno
SE
Instrues

(v) ento
Instrues

{Fim do bloco Condicional}

FIM

Exemplo Prtico: (utilizando o portugus estruturado) a. Ir para escola Se (fazer Frio) Ento Vestir blusa Seno Vestir Camiseta Fim se Chegar a escola b. Sair a noite Chegar a portaria do clube Mostrar a identidade Se (idade >= 18) Ento Entrar no baile Curtir a festa Seno No entrar no baile Fim Se Voltar para casa

c.

Fazer a prova Obter a nota Se (nota < 30) Ento Reprovado Seno Se (nota >= 30) e (nota < 60) Ento Recuperao Seno Aprovado Fim se Fim se
Copyright 2004 Pgina - 10 -

Prof. Cristiano Vieira

FEPI Colgio Universitas

Introduo a Lgica de Programao

Exemplo Prtico: (utilizando algoritmo)


a. Incio // variveis inteiro hora; caracter Ao1, Ao2, Ao3, Ao4, Ao5; // principal leia(hora); Se hora > 6 e hora < 18 ento Ao1 = Levantar, tomar caf, trabalhar, almoar, trabalhar e ir embora; Se hora > 6 e hora < 12 ento Ao2 = Levantar, tomar caf, trabalhar e almoar; Se hora > 6 e hora < 9 ento Ao3 = Levantar, tomar caf e trabalhar; Se hora > 6 e hora < 8 ento Ao4 = Levantar e tomar caf ; Se hora > 6 e hora < 7 ento Ao5 = Levantar; Fim se; Fim se; Fim se; Fim se; Fim se; Fim. Incio // variveis inteiro hora; caracter perodo; // principal leia(hora); Se hora > 6 e hora < 12 ento perodo = manha; Seno Se hora > 12 e hora < 18 ento perodo = tarde; Seno Se hora > 18 e hora < 24 ento perodo = noite; Seno Se hora > 0 e hora < 6 ento perodo = madrugada; Fim se; Fim se; Fim se; Fim se; Fim. Incio inteiro hora; caracter perodo; leia(hora); Se hora > 6 e hora < 18 ento Fim se; Se hora > 6 e hora < 12 ento Fim se; Se hora > 18 e hora < 24 ento Fim se; Se hora > 12 e hora < 18 ento Fim se; Fim.
Prof. Cristiano Vieira Copyright 2004 Pgina - 11 -

b.

c.

perodo = dia; perodo = manha; perodo = noite; perodo = tarde;

FEPI Colgio Universitas

Introduo a Lgica de Programao

2.2.3 Seleo Mltipla (CASO) Utilizada quando temos muitas possibilidades para uma determinada situao, onde a aplicao da estrutura se...ento...seno, tornaria o algoritmo muito complexo. Modelo de Seleo Multipla Pseudocdigo: INICIO
INIC

Fluxograma:

{Caso (Opo)} CASO Opo1 {Aes } Opo2, Opo3, ... {Aes } Seno {Aes } {Fim do Caso}
Opo 1 Opo 2 Opo N

...

...

FIM

Caso <expresso> valor1 : <comando 1>; valor2 : valor5 : <comando 2>; ... seno <comando n>; fim-caso;

As opes podem apresentar valores individuais ou uma faixa de valores.

Exemplo Prtico: (utilizando o portugus estruturado) a. Cumprimentar algum Olhe as Horas Caso(Horas) >=6 e <11: Bom Dia >=12 e <18: Boa Tarde >=18 e <24: Boa Noite Fim do caso b. Caixa Eletrnico Informe a opo Caso(opo) saque: Agncia, n.conta, senha, valor. Retirar dinheiro extrato:Informar Agncia,n.conta, senha. Retirar extrato deposito:Informar Agncia,n.conta, valor. Retirar comprovante Fim do caso

Prof. Cristiano Vieira

Copyright 2004

Pgina - 12 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Exemplo Prtico: (utilizando o algortmo)

a.

Inicio // declarao de variveis Inteiro Numero; Caracter Extenso; // Principal leia(Numero); caso(Numero) 1: Extenso Um; 2: Extenso Dois; 3: Extenso Trs; 4: Extenso Quatro; 5: Extenso Cinco; 6: Extenso Seis; 7: Extenso Sete; 8: Extenso Oito; 9: Extenso Nove; seno: Extenso Erro; fim-caso; Fim.

b.

Inicio // declarao de variveis Inteiro A,B, Opcao; Real C; // Principal A 3; B 2; escreva( Escolha sua opo:); escreva( 1 Somar.); escreva( 2 Subtrair.); escreva( 3 Multiplicar.); escreva( 4 Dividir.); leia(Opcao); caso(Opcao) 1: C A+B; 2: C A-B; 3: C A*B; 4: C A/B; seno: escreva(Invlido); fim-caso; escreva(O resultado ser: ,C); Fim.

Lista de exerccios...

Entregar em: ______/______/_______

Prof. Cristiano Vieira

Copyright 2004

Pgina - 13 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

2.3 Programao Estruturada de Repetio Uma estrutura de Repetio aquela cujas aes so executadas repetidamente, enquanto uma determinada condio permanece vlida. O fator que diferencia os vrios modelos de estrutura de repetio o ponto em que ser colocada a condio. Existem 3 tipos de estruturas de repetio: 2.3.1 Para-Faa 2.3.2 Enquanto-Faa 2.3.3 Repita-At

2.3.1 Para-Faa Usamos a estrutura Para-Faa quando precisamos repetir um conjunto de comandos em um nmero pr-definido de vezes. conhecida como estrutura de repetio por laos (loops) definidos, pois se utiliza uma varivel de controle que incrementada em um nmero determinado de unidades de um valor inicial at um valor final. Modelo de Repetio Para-Faa Pseudocdigo: INICIO Fluxograma:
INICIO

{PARA <nmero de vezes> FAA}

PARA <n. Vezes>

AT

{Instruo a ser repetida}

Incremento da varivel Instruo

FAA

{Fim do PARA-FAA} FIM.

PARA Inicio AT Fim FAA <Sentena 1>; <Sentena 2>; <Sentena n>; Fim-Para;

Execuo enquanto Incio for menor ou igual a Fim

Quando o algoritmo encontra a instruo fim-para, incrementa a varivel INICIO em 1 unidade (default) ou mais. Cada vez que completada o bloco de instruo, ele retorna a linha da estrutura PARA e testa se INICIO menor ou igual a FIM, se for menor ou igual o processo continua no lao (loop), caso no, o processo abandonado. Obs: O valor da varivel INICIO no pode ser alterado no interior da estrutura.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 14 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Exemplo Prtico: (utilizando o portugus estruturado) Ir de elevador do primeiro ao quinto Andar Chamar o elevador Entrar no elevador Informar o andar Para andar do primeiro at o quinto faa mover ao prximo andar Fim do Movimento Sair do elevador

Exemplo Prtico: (utilizando o algoritmo) a. Inteiro var, resultado; para var 1 at 10 faa resultado 2 * var; fim-para; escreva(resultado); b. Inteiro var, resultado; para var 1 at 10 faa resultado 2 * var; escreva(resultado); fim-para;

c. Inteiro var, resultado; para var1 at 5 passo 2 faa resultado 2 * var; escreva(resultado); fim-para;

:: Exerccios propostos ::

Dadas as informaes a seguir escreva a srie Variavel x 1 30 Valor inicial Valor final

Regra de ciclo x<-x+1 Formula padrao x+(x*2)/(x^2)

Prof. Cristiano Vieira

Copyright 2004

Pgina - 15 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

2.3.2 Enquanto-Faa Utilizada quando no sabemos o nmero de repeties e quando possumos uma expresso que deve ser avaliada para que os comandos da estrutura sejam executados. Assim, enquanto o valor da <condio> for verdadeiro, as aes dos comandos so executadas. Quando for falso, a estrutura abandonada, passando a execuo para a prxima linha aps o comando FIM-ENQUANTO. Se j da primeira vez o resultado for falso, os comandos no sero executados. Modelo de Repetio Enquanto-Faa Pseudocdigo: INICIO Fluxograma:
INICIO

{ENQUANTO <Condio> FAA} (Falso) (Verdade) {Instruo a ser repetida}

ENQUANTO <Condio>

(F) FIM

(V) FAA Instruo

{Fim do ENQUANTO-FAA} FIM.

Enquanto <condio> Faa <comando 1>; <comando 2>; <comando n>; Fim-Enquanto;

execuo enquanto a condio for verdadeira

sempre importante observar que primeiro se analisa a condio para depois dependendo do resultado obtido executar o bloco a ser repetido. Caso a condio no seja satisfeita nada ser feito e a prxima linha aps o fimenquanto ser requisitada. Tambm necessrio caso a condio seja verdadeira permitir o incremento para a varivel em condio (se necessrio) para que a estrutura no entre em loop infinito.

Exemplo Prtico: (utilizando o portugus estruturado) Ir de elevador do primeiro ao quinto Andar Chamar o elevador Entrar no elevador Informar o Andar Enquanto Andar atual for menor que 5 faa mover o elevador para cima Andar passa para o prximo Fim do Movimento Sair do elevador

Prof. Cristiano Vieira

Copyright 2004

Pgina - 16 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Exemplo Prtico: (utilizando o algoritmo) a. aux 1; enquanto (aux <= 10) faa resultado 5 * aux; aux aux + 1; fim-para

:: Exerccios propostos ::

Analisando Sries co estruturas de repetio S=3/6 Variveis envolvidas: Valores de Inicio: Frmula Padro: Regra de Ciclo:

Prof. Cristiano Vieira

Copyright 2004

Pgina - 17 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

2.3.3 Repita-At Utilizada quando no sabemos o nmero de repeties e quando os comandos devem ser executados pelo menos uma vez, antes da expresso ser avaliada. Assim, o programa entra na estrutura Repita...At que executa seus comandos pelo menos uma vez. Ao chegar no fim da estrutura, a expresso ser avaliada. Se o resultado da expresso for verdadeiro, ento o comando abandonado. Modelo de Repetio Repita-At Pseudocdigo: INICIO Fluxograma:
INICIO

{REPITA}

Instruo

{Instruo a ser repetida}


(F)

REPITA AT <condio>

{AT <condio>} FIM.

(V)

Repita <comando 1>; <comando 2>; <comando n>; At <condio>;

executado pelo menos uma vez

Exemplo Prtico: (utilizando o portugus estruturado) a. Ir de elevador do primeiro ao quinto Andar Chamar o elevador Entrar no elevador Informar o Andar Repita mover o elevador para cima Andar passa para o prximo At Andar atual igual a 5 Sair do elevador b. Executar um aplicativo com senha Abrir o Windows Abrir a pasta do aplicativo Executar o arquivo principal Repita Digitar a senha At senha ser vlida Usar o aplicativo

Prof. Cristiano Vieira

Copyright 2004

Pgina - 18 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Exemplo Prtico: (utilizando o algoritmo) a. aux 1; repita resultado 5 * aux; escrever resultado; aux aux + 1; at (aux > 10);

:: Exerccios propostos ::

inicio inteiro x, y; x <- 0; y <- 0; enquanto x > 0 faa y <- y + 3; x <- x + 1; fim-enquanto; fim.

inicio inteiro x, y; x <- 0; y <- 0; repita y <- y + 3; x <- x + 1; at x > 0; fim.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 19 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

3. Aplicao de variveis dimensionais homogneas 3.1 Vetores Variveis Unidimensionais Os vetores so estruturas de dados que permitem o armazenamento de um conjunto de dados de mesmo tipo. Por este motivo, so chamadas de estruturas homogneas. Os vetores so unidimensionais, pois cada elemento do vetor identificado por um ndice. Similarmente, podemos definir vetores como posies de memria, identificadas por um mesmo nome, individualizadas por ndices e cujo contedo de mesmo tipo. Para acessarmos um elemento de um vetor, referimo-nos ao nome do vetor acompanhado pelo seu ndice que vir entre colchetes ( [ e ] ). Pense num prdio com 120 apartamentos. Para enviar uma correspondncia a um determinado apartamento, devemos colocar no endereo de destinatrio, o nmero do prdio mais o nmero do apartamento. O vetor funciona de forma similar. Veja a sintaxe da declarao de um vetor:

Tipo Bsico de Dados: Nome do vetor[ n de elementos ] Para fazermos referncia a um elemento do vetor, colocamos:

Nome do vetor[ elemento ] Cada elemento de um vetor tratado como se fosse uma varivel simples.

Exemplo: Supondo que pedssemos para criar um algoritmo para ler o nome de 5 pessoas, e mostrasse esses nomes na ordem inversa de leitura. A princpio, vocs pensariam em cinco variveis: nome1, nome2, nome3, nome4 e nome5. Veja como ficaria a soluo, nesse caso: Inicio caracter: nome1, nome2, nome3, nome4, nome5; escreva(Informe o nome de 5 pessoas: ); leia(nome1); //ANA //PAULA leia(nome2); //CRISTINA leia(nome3); //GUSTAVO leia(nome4); //ANTONIO leia(nome5); escreva(Ordem Inversa de Leitura ); escreva(nome5); escreva(nome4); escreva(nome3); escreva(nome2); escreva(nome1); Fim

Prof. Cristiano Vieira

Copyright 2004

Pgina - 20 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Assim, na memria teramos ... Nome1 ANA Nome2 PAULA Nome3 CRISTINA Nome4 GUSTAVO Nome5 ANTONIO

Todavia, se alterssemos esse algoritmo para ler o nome de 100 pessoas, a soluo anterior se tornaria invivel. Para casos como este, podemos fazer uso de vetores. Se tivssemos criado 100 variveis, teramos 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 declarao do vetor se limita linha: caracter: nome[100]. Veja que para todos os elementos nos referimos ao mesmo nome de vetor Nome.

Assim, veja a soluo do algoritmo anterior com o uso de vetores:

Incio Caracter: nome[5]; Inteiro: aux; para aux 1 at 5 faa escreva(Informe o Nome , aux); leia(nome[aux]); fim-para; escreva(Ordem Inversa de Leitura ); para aux 5 at 1 faa escreva (nome[aux]); fim-para fim

Veja a representao da memria:

1 ANA

2 PAULA

NOME 3 CRISTINA

4 GUSTAVO

5 ANTONIO

Prof. Cristiano Vieira

Copyright 2004

Pgina - 21 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

3.2 Matrizes Variveis Multidimensionais

As matrizes so estruturas de dados que permitem o armazenamento de um conjunto de dados de mesmo tipo, mas em dimenses diferentes. Os vetores so unidimensionais, enquanto as matrizes podem ser bidimensionais (duas dimenses) 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 referncia a um elemento da matriz sero necessrios tantos ndices quantas forem as dimenses da matriz. Veja a sintaxe da declarao de uma matriz: Tipo bsico de Dados : Nome da matriz [ Li, Ls, Nq ] onde: Li Limite inferior * Ls Limite superior * Nq Nmero de quadrantes ( somente para matrizes multidimensionadas )
* Valores obrigatrios

Para fazermos referncia a um elemento da matriz, colocamos: Nome da matriz [ linha, coluna ] O nmero de dimenses de uma matriz pode ser obtido pelo nmero de vrgulas (,) da declarao mais 1. O nmero de elementos pode ser obtido atravs do produto do nmero de elementos de cada dimenso. Obs: Quando voc desejar percorrer uma matriz, linha por linha, crie uma estrutura de repetio, 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 trs vendedoras de uma loja. Na interseo de cada linha x coluna, colocaremos o faturamento dirio de cada vendedora.

( Segunda ) COLUNA 1 ( SANDRA ) LINHA 1 ( VERA ) LINHA 2 ( MARIA ) LINHA 3 1050,00 785,00 1658,00

( Tera ) COLUNA 2 950,00 1540,00 1245,00

( Quarta ) COLUNA 3 1241,00 1400,00 1410,00

( Quinta ) COLUNA 4 2145,00 546,00 245,00

( Sexta ) COLUNA 5 1256,00 0,00 1546,00

Prof. Cristiano Vieira

Copyright 2004

Pgina - 22 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

A representao desta tabela em forma de matriz, seria: VendasDiarias : matriz [ 3, 5 ] de real;

Veja como ficaria o algoritmo para ler esses valores: Algoritmo LeVendasDiarias; Inicio real: VendasDiarias[3,5]; inteiro: ndLinha, indColuna, i ; //Variando o nmero de linhas - Vendedoras Para indLinha 1 at 3 faa escrever (Vendedora :, indLinha); //Variando o nmero de colunas Dias da Semana Para indColuna 1 at 5 faa escreva (Faturamento do Dia : , indColuna); leia (VendasDiarias[indLinha, indColuna]); Fim-para; Fim-para; Fim

Poderamos melhorar o algoritmo acima, trabalhando com um vetor que contivesse os nomes dos dias da semana e das vendedoras. Assim, a comunicao do programa com o usurio ficaria mais clara. Veja: Algoritmo LeVendasDiariasVersao2; Inicio real: VendasDiarias[3,5]; caracter: Vendedoras[3]; caracter: DiasSemana[5]; inteiro: indLinha, indColuna; Vendedoras[1] Sandra; Vendedoras[2] Vera; Vendedoras[3] Maria; DiasSemana[Segunda, Tera, Quarta, Quinta, Sexta); //Variando o nmero de linhas - Vendedoras Para indLinha 1 at 3 faa escreva(Vendedora : , Vendedoras[indLinha]); //Variando o nmero de colunas Dias da Semana Para indColuna 1 at 5 faa escreva(Fatur.do Dia:, DiasSemana[indColuna]); leia(VendasDiarias[indLinha, indColuna]); Fim-para; Fim-para; Fim

Prof. Cristiano Vieira

Copyright 2004

Pgina - 23 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Um algoritmo que apenas l e nada faz com esses resultados, no serve para grande coisa, certo ?! Por isso, vamos melhorar esse algoritmo e apresentar como resultado o faturamento dirio de todas as vendedoras. Algoritmo LeVendasDiariasVersao3; Incio real: VendasDiarias[3,5]; caracter: Vendedoras [3], DiasSemana[5]; inteiro: indLinha, indColuna; real: FaturaDia; Vendedoras[1] Sandra; Vendedoras[2] Vera; Vendedoras[3] Maria; DiasSemana[1] DiasSemana[2] DiasSemana[3] DiasSemana[4] DiasSemana[5] Segunda; Tera; Quarta; Quinta; Sexta;

//Variando o nmero de linhas Vendedoras } para indLinha 1 at 3 faa escreva(Vendedora : , Vendedoras[indLinha]); //Variando o nmero de colunas Dias da Semana para indColuna 1 at 5 faa escreva(Fatur.do Dia : , DiasSemana[indColuna]); leia(VendasDiarias[indLinha, indColuna]); fim-para; fim-para; //Vamos comear variando a coluna, para poder obter o //faturamento de cada dia da semana Para indColuna 1 at 5 faa //A cada novo dia a varivel que recebe faturamento // zerada FaturaDia 0; //Vamos variar a linha, para obter os valores //faturados de cada vendedora para indLinha 1 at 3 faa FaturaDiaFaturaDia + _ VendasDiarias[indLinha,indColuna]; fim-para escreva(Faturamento de : , DiasSemana[indColuna]); escreva(FaturaDia); fim-para; fim

Prof. Cristiano Vieira

Copyright 2004

Pgina - 24 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

4. Anlise de algoritmos para ordenao de vetores 4.1 O Algoritmo Bubble Sort (Mtodo da Bolha) Uma introduo ao sort da bolha Um dos mtodos de ordenao o sort da bolha. O sort da bolha funciona movendo repetidamente o maior elemento para a posio de maior ndice do vetor. Ao invs de percorrer todo o vetor para localizar o maior elemento, o sort da bolha se concentra em sucessivos pares de elementos adjacentes no vetor. Ele compara os dois elementos,e ento ou os troca (se o elemento com o menor ndice maior que o outro elemento) ou os deixa do jeito que esto (se o elemento com o menor ndice menor do que o outro elemento). Em ambos os casos, aps tal passo, o maior dos dois elementos estar na posio de maior ndice.

O foco ento se move para a prxima maior posio, e o processo repetido. Quando o foco alcana o final do vetor, o maior elemento ser movido de qualquer que tenha sido sua posio original para o fim ou para a posio de maior ndice no vetor. O processo ento repetido, fazendo com que o segundo maior elemento seja movido para a posio de maior ndice - 1. Este processo refeito at que todos os elementos do vetor tenham sido ordenados. Veja um exemplo mais detalhado de um sort da bolha. Um algoritmo genrico para o sort da bolha O algoritmo do sortda bolha tem muitas variantes. No entanto, o algoritmo dado abaixo uma bse para todos eles. Examinaremos funciona. Loop Principal agora como este algoritmo

Procedure BubbleSort(item[1..n]) for j:=n downto 1 do for k:=1 to (j-1) if item[k] > item[k+1] then Troca(item,k,k+1); Return Procedure Troca(A,i,j) Aux = A[i] A[i] = A[j] A[j] = Aux Return

Compara dois elementos nas posies "k" "k + 1"

adjacentes

Se o elemento na posio "k" maior do que o elemento "k + 1" ento troca a posio dos dois valores Uma iterao move o maior valor para a ltima posio do vetor Repete o loop Finaliza o loop principal

Prof. Cristiano Vieira

Copyright 2004

Pgina - 25 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Um algoritmo para o sort da bolha tambm pode ser descrito passo a passo como se segue: 1. Repete o passo 4 num total de n-1 vezes. 2. Repete o passo 3 para os elementos na parte no ordena do vetor. 3. Se o elemento atual do vetor maior do que o prximo elemento ento troca os elementos. 4. Se nenhuma mudana feita, ento retorne, caso contrrio reduz o tamanho da parte no ordenada em 1. Eficincia do Sort da Bolha O sort da bolha composto de dois loops. O nmero de vezes que o loop externo iterage ( repetido) determinado pela natureza da lista que vai ser ordenada. O loop interno repitido uma vez a menos do que o nmero de de elementos no vetor e novamente chamado (do comeo) toda vez que se se repete o loop externo. Ento a ordem do loop interno n-1 ou O(n-1). Melhor Caso Neste caso, a lista j est ordenada quando o algoritmo do sort da bolha chamado. O loop interno ir se repetir sem que a condio do if seja verdadeira. O loop externo ir terminar aps uma repetio. Portanto, no melhor caso, o loop interno ir se repetir num total de n-1 vezes, a condio do if nunca ser verdadeira, o procedure de troca nunca ser chamado e o nmero de trocas 0. Pior Caso Neste caso, a anlise se torna um pouco mais difcil. O pior caso para o algoritmo do sort da bolha, ocorre com uma lista invertida (9 8 7 ... 1). O maior elemento se encontra no incio da lista e portanto tem que ser movido para o final para que a lista fique em ordem. Na primeira iterao do loop externo, ele ser trocado com o segundo elemento, na segunda iterao do loop, ser trocado com o terceiro elemento. Continuando este raciocnio, este elemento se mover uma posio at alcanar o final da lista a cada iterao do loop externo. Para ele se mover do incio at o final da lista, ele ter que ser trocado n-1 vezes. Todos os outros elementos da lista sero movidos uma posio at alcanar o incio ou at o final da lista a cada iterao. Como os elementos no incio ou no final da lista tm a distncia mais longa a percorrerem, todos os outros elementos estaro em suas posies corretas quando o elemento que estiver no final da lista tenha sido movido para o incio. Uma ltima iterao ser necessria para determinar que a lista esteja ordenada. Portanto, o nmero total de iteraes do loop externo para se ordenar uma lista invertida n e o nmero total de iteraes do loop interno n(n-1), o qual aproximadamente igual a n2 ou O(n2). Vantagens e desvantagens do sort da bolha Uma das principais vantagens do sort da bolha que ele extremamente fcil de implementar (por volta de 5 linhas de cdigo). tambm bastante fcil de se entender em se tratando de um algoritmo de ordenao. Infelizmente, o sort da bolha um algoritmo muito lento, levando O(n2) para finalizar a ordenao e portanto, no deve ser usado em tabelas muito grandes.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 26 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

4.2 O Algoritmo do Mtodo da Insero Mtodo da Insero Um dos mtodos mais simples de se ordenar um vetor o Sort da insero. Um exemplo do Sort da Insero ocorre em nosso dia a dia toda a vez que jogamos baralho. Para ordenar as cartas que temos na mo, extramos uma carta, movemos as cartas restantes e colocamos a carta extrada no seu lugar correto. Este processo se repete at que todas estejam na sequncia correta. Ambos mdio e pior caso tm uma complexidade de O(n2). Funcionamento O sort da insero como o sort da bolha, s que mais eficiente. O sort da insero pega o primeiro elemento e o compara com o elemento prximo a ele. Se este for maior,os dois elementos so trocados. Ento ele vai percorrendo todo o vetor comparando todos os outros elementos com o primeiro elemento. Se encontrar um valor menor do que ele, o algoritmo o troca com o primeiro elemento.Quando o final do vetor alcanado, se move para o segundo elemento e o compara com os elementos que o seguem no vetor. E faz uma troca se encontrar algum menor que ele. Percorre todo o resto do vetor dessa maneira at comparar o penltimo elemento com o ltimo elemento. Ele usa menos comparaes e isso o torna mais rpido que o sort da bolha. Comeando pelo topo do vetor na Figura 1(a), extramos o 3. Ento os elementos acima so movidos para baixo at acharmos o lugar correto para inserirmos o 3. Este processo repetido na Figura 1(b) com o prximo nmero. Finalmente, na Figura 1(c), completamos a ordenao colocando o 2 em seu devido lugar.

Figura 1: Sort da Insero Assumindo que temos n elementos no vetor, temos que passar por n - 1 entradas. Para cada entrada, temos que examinar e mover n - 1 outras entradas, resultando num algoritmo de complexidade O(n2). O sort da insero no usa memria extra, pois a ordenao feita no prprio vetor de origem.O sort da insero tambm estvel. Sorts estveis mantm a ordem original das chaves quando chaves idnticas esto presentes nos dados de entrada.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 27 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Um algoritmo para o sort da insero Segue abaixo o algoritmo do sort da insero: algorithm insertionsort begin for i= n-1 down to 1 begin temp = xi j = i+1 while(j <= n and xj < temp) begin xj - 1 = xj j=j+1 end xj - 1 = temp end end

Para ver o que est acontecendo, a tabela abaixo mostra o algoritmo trabalhando na lista (4, 3, 6, 1, 5, 2). i = 5 4 3 6 1 5 2 temp = 5 i = 4 4 3 6 1 2 5 temp = 1 i = 3 4 3 6 1 2 5 temp = 6 i = 2 4 3 1 2 5 6 temp = 3 i = 1 4 1 2 3 5 6 temp = 4 I = 0 1 2 3 4 5 6 temp = O algortimo passo a passo pode ser descrito como se segue: 1. De um at o comprimento do vetor -1 faa os passos de 2 a 4 2. Em seguida ao primeiro loop at o final do vetor-1 faa o passo 3 3. Se vetor[varivel] maior do que vetor[varivel + 1] ento troque os elementos 4. Repita isto at que o penltimo elemento seja comparado com o ltimo elemento

4.3 O Algoritmo do Mtodo da Seleo Uma introduo ao Mtodo da Seleo O mtodo da seleo um dos meios mais fceis de se ordenar dados. Ao invs de trocar nmeros vizinhos a toda hora como o Sort da Bolha , este algoritmo identifica o menor elemento do vetor e o compara com o elemento da primeira posio do vetor. Depois disso, ele reexamina os elementos restantes no vetor para achar o segundo menor elemento. O elemento encontrado comparado com o elemento da segunda posio do vetor. Este processo se repete at que todos os elementos sejam ordenados. A ordem pode ser definida pelo usurio (i.e. decrescente ou crescente). Um algoritmo genrico para o mtodo da seleo Segue abaixo algoritmo da seleo em pseudocdigo:

Seleo ( A, N ) For i = 1 to n-1 do min = i


Prof. Cristiano Vieira Copyright 2004 Pgina - 28 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

For j =i+1 to n do if A[j] < A[min] then min = j A[min] = a[ i ] End If Next j Next i Return Um algoritmo de seleo tambm pode ser descrito passo a passo como se segue : 1. Repita os passos de 1 a 5 no total de n-1 vezes. 2. Grave a parte do vetor que j est ordenada. 3. Repita o passo 4 para os elementos na parte no ordenada do vetor. 4. Grave a posio do menor elemento da parte no ordenada do vetor 5. Compare o primeiro elemento do vetor no ordenado com o menor elemento Eficincia do mtodo da seleo Para um determinado nmero de elementos, o mtodo da seleo passa por um nmero de comparaes e trocas, portanto sua performance previsvel O nmero de iteraes entre os elementos depende o quo ordenado est o vetor. Durante cada passo apenas uma troca essencial, portanto o nmero mximo de trocas para este algoritmo n-1 O nmero total de comparaes proporcional a n2 ou O(n2). Pior caso O pior caso do mtodo da seleo n2/4. Vantagens e desvantagens do mtodo da seleo O mtodo da seleo fcil de entender e isto facilita a correta implementao do algoritmo. E faz com que o processo de ordenao seja fcil de escrever. No entanto, h algumas razes pelas quais os programadores se recusam a usar este algoritmo: 1. Este mtodo usa ordenao interna. Isto significa que todo o vetor teria que ser carregado na memria principal, o que requereria uma memria muito grande. No caso de grandes bancos de dados comerciais, mais memria do que a disponvel. 2. O performance O (n2) do algoritmo tornaria-se muito lenta em grandes volumes de dados.Se voc tiver um vetor com 100.000 elementos, o mtodo da seleo no seria a escolha correta. 3. Atualmente, muitas base de dados de aplicaes possuem listas ordenadas dos dados e essas listas so atualizadas regularmente. Na maioria das vezes estas base de dados esto, em sua maior parte, em ordem. Um mtodo ideal seria capaz de reconhecer este fato e trabalharia apenas com os itens no ordenados. O mtodo da seleo incapaz de fazer isso

4.4 O Algoritmo MergeSort ( Mtodo da Recursividade ) MergeSort um algoritmo de ordenao recursivo que usa O(n log n) comparaes para o pior caso. Para ordenar um vetor de n elementos, ns executamos os trs passos seguintes em sequncia:
Prof. Cristiano Vieira Copyright 2004 Pgina - 29 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Se n < 2, ento o vetor j est ordenado. De outra forma, se n > 1, ns executamos os trs passos: 1. Ordenamos a metade esquerda do vetor. 2. Ordenamos a metade direita do vetor. 3. Intercalamos as metades. Complexidade de Tempo Para se ter uma ideia de quanto tempo leva a execuo de um algoritmo MergeSort, ns levamos em considerao o nmero de comparaes que ele faz para o pior caso. O clculo do consumo de tempo de um algoritmo recursivo consiste, essencialmente, na soluo de uma relao de recorrncia. Usaremos uma funo T(n), onde n o tamanho do vetor que queremos ordenar. Ordenao por intercalao Rearranjar um vetor A[p..r] de modo que ele fique em ordem crescente. Eis um algoritmo recursivo que resolve o problema. Ele supe que p <= r e adota o caso p = r como base da recurso. MERGESORT (A, p, r) se p < r ento q := cho((p+r)/2) MERGESORT (A, p, q) MERGESORT (A, q+1, r) INTERCALA (A, p, q, r) P 1 3 5 Q 9 q+1 9 2 r 8 O procedimento INTERCALA recebe A[p..q..r] tal que A[p..q] e A[q+1..r] so crescentes e rearranja o vetor de modo que A[p..r] fique crescente. INTERCALA (A, p, q, r) para i := p at q faa B[i] := A[i] para j := q+1 at r faa B[r+q+1-j] := A[j] i := p j := r para k := p at r faa se B[i] <= B[j] ento A[k] = B[i] i = i+1 seno A[k] = B[j] j := j-1

Observe que p <= q < r. Com isso, tanto A[p..q] quanto A[q+1..r] so estritamente menores que A[1..n].

Analisando-se esse procedimento, percebe-se que a complexidade de tempo de Intercala O(n). Ento, qual o consumo de tempo do MERGESORT no pior caso?

Uma Expresso para T(n)

Como o MergeSort tem dois casos, a descrio de T(n) tambm ter dois casos. O 1 Caso a base da recurso: T(n) = 0, se n > 2.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 30 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Para o caso do vetor ter n elemento com n > 1,o nmero de comparaes usadas para ordenar n elementos no mximo a soma do nmero de comparaes para cada uma das metades. T(n) = T(n/2) + T(n/2) + n, se n > 1. Observando a expresso acima, temos que o 1 termo da expresso indica o n de comparaes usadas para ordenar a metade esquerda do vetor. O segundo termo da expresso indica o n de comparaes usadas para ordenar a metade direita do vetor. O ltimo termo n, indica o n de comparaes usadas no procedimento Intercala. Como encontrar a Complexidade de Tempo Para tanto, deve-se primeiramente enunciar o seguinte Teorema: Teorema: Sejam a,b,c,k constantes no negativas com a >0, b > 1, a soluo para T(n) = aT(n/b) + cnk : T(n) : O(n logab), a > bk O(nk logn), a = bk O(nk), a < bk No nosso caso, T(n) = 2T(n/2) + n, temos que : a=2 b=2 cnk = n, logo k = 1 Temos a seguinte relao : a = bk <--> 2 = 21 Dessa relao temos que T(n) O(nk logk), ou seja, O algoritmo MergeSort O(n log n)

Prof. Cristiano Vieira

Copyright 2004

Pgina - 31 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

4.5 O Algoritmo QuickSort ( Mtodo Rpido )

Algoritmo Bsico Quicksort trabalha particionando um arquivo em duas partes e ento as ordenando separadamente. Pode ser definido recursivamente: quicksort (tipoInfo : a[], inteiro : esq, dir) inteiro i; incio se dir > esq ento i <- particione(a, esq, dir); quicksort(a, esq, i-1); quicksort(a, i+1, dir); fim se fim Os parmetros dir e esq delimitam os subarquivos dentro do arquivo original, dentro dos quais a ordenao ocorre. A chamada inicial pode ser feita com quicksort(a, 1, N); O ponto crucial o algoritmo de partio. Particionamento em Quicksort O procedimento de particionamento deve rearranjar o arquivo de maneira que as seguintes condies valham: 1. o elemento a[i] est em seu lugar final no arquivo para um i dado, 2. nenhum dos elementos em a[esq],...,a[i-1] so maiores do que a[i], 3. nenhum dos elementos em a[i+1],...,a[dir] so menores do que a[i].

Exemplo Ordenao do vetor inicial 25 57 48 37 12 92 86 33. Se o primeiro elemento (25) for colocado na sua posio correta, teremos: 12 25 57 48 37 92 86 33. Neste ponto: todos os elementos abaixo de 25 sero menores e todos os elementos acima de 25 sero maiores que 25. Como 25 est na sua posio final, o problema foi decomposto na ordenao dos subvetores: (12) e (57 48 37 92 86 33). O subvetor (12) j est classificado. Agora o vetor pode ser visualizado: 12 25 (57 48 37 92 86 33). Repetir o processo para a[2]...a[7] resulta em: 12 25 (48 37 33) 57 (92 86) Se continuarmos particionando 12 25 (48 37 33) 57 (92 86), teremos: 12 25 (37 33) 48 57 (92 86) 12 25 (33) 37 48 57 (92 86) 12 25 33 37 48 57 (92 86) 12 25 33 37 48 57 (86) 92 12 25 33 37 48 57 86 92

Prof. Cristiano Vieira

Copyright 2004

Pgina - 32 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Viso da Recursividade do Quicksort como rvore: O subproblema da partio O corao do QUICKSORT est no seguinte subproblema, que formularemos de maneira propositalmente vaga: rearranjar A[p..r] de modo que todos os elementos pequenos fiquem na parte esquerda do vetor e todos os elementos grandes fiquem na parte direita. Este o subproblema da partio . O ponto de partida para a soluo do subproblema a escolha de uma "chave", digamos x: os elementos do vetor que forem maiores que x sero considerados grandes e os demais sero considerados pequenos. A dificuldade est em escolher x de tal modo que cada uma das duas partes do vetor rearranjado seja estritamente menor que o vetor todo. O seguinte algoritmo resolve o subproblema da separao da seguinte maneira: supondo p < r, o algoritmo rearranja os elementos de A[p..r] e devolve um ndice q tal que p <= q e A[i] <= x para cada i p..q e A[j] >= x para cada j em q+1..r

em q<r para algum x.

Essa verso do algoritmo adota como chave x o valor inicial de A[p]. p q q+1 r <= x <= x <= x <= x <= x <= x >= x >= x >= x >= x >= x >= x

1 2 3 4 5 6 7 8 9 10 11

PARTICIONE (A, p, r) x := A[p] i := p-1 j := r+1 enquanto 0 = 0 faa repita j := j-1 at que A[j] <= x repita i := i+1 at que A[i] >= x se i < j ento troque A[i] :=: A[j] seno devolva j

Para entender como e por que o algoritmo funciona de acordo com sua especificao, observe que no incio de cada nova iterao do loop que comea na linha 4 temos as seguintes propriedades: A[p..i] <= x , i<j , A[j..r] >= x . j r >= x >= x

p i <= x <= x <= x

Prof. Cristiano Vieira

Copyright 2004

Pgina - 33 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Na ltima passagem pela linha 4 o vetor A[i+1..j-1] consiste em zero ou mais elementos < x seguidos de zero ou mais elementos > x ou

zero ou mais elementos < x , seguidos de exatamente um elemento igual a x , seguido de zero ou mais elementos > x .

No primeiro caso, o algoritmo chega linha 11 com j = i-1. p j i r <= x <= x <= x <= x <= x <= x >= x >= x >= x >= x >= x >= x No segundo caso, o algoritmo chega linha 11 com j = i. p J=i <= x <= x <= x <= x <= x = x r >= x >= x >= x >= x >= x >= x

No difcil perceber agora que o algoritmo faz o que prometeu; em particular, que p <= j < r na linha 11. O desempenho do algoritmo de partio Quanto tempo o algoritmo PARTICIONE consome? Comecemos contando o nmero total de execues da linha 5 (note que entre duas execues da linha 5 podem ocorrer execues das linhas 7, 8, 9 e 4). O valor de j diminui a cada execuo da linha 5. O valor inicial de j r+1 e o valor final pelo menos i-1, que vale pelo menos p-2. Logo, o nmero total de execues da linha 5 no passa de r-p+3. claro que o nmero total de execues da linha 6 tambm no passa de r-p+3. Uma anlise semelhente mostra que o nmero total de execues da linha 7 no passa de rp+3. O mesmo se pode dizer das linhas 8 e 9. O nmero de execues da linha 4 tambm no pode passar de r-p+3. Portanto, se a execuo de cada linha consome 1 unidade de tempo, o consumo total de tempo no passa de 7(r-p)+10, ou seja, de 7n + 3 , onde n denota r-p+1, ou seja, o nmero de elementos do vetor A[p..r]. Esta delimitao vale sob a hiptese de 1 unidade de tempo por linha. Na realidade, diferentes linhas podem consumir diferentes quantidades de tempo, mas cada uma consome uma quantidade de tempo que no depende dos dados do problema. Se refizermos os clculos levando isso em conta, veremos que o consumo de tempo de nosso algoritmo O(n) , No difcil verificar que o consumo de tempo do PARTICIONE tambm Omega(n). O algoritmo Quicksort O algoritmo QUICKSORT recebe um vetor A[p..r] e rearranja o vetor em ordem crescente. 1 2 3 4 QUICKSORT (A, p, r) se p < r ento q := PARTICIONE (A, p, r) QUICKSORT (A, p, q) QUICKSORT (A, q+1, r)

(Note que q >= p e q < r; portanto os vetores A[p..q] e A[q+1..r] so estritamente menores que o vetor original A[p..r].)
Prof. Cristiano Vieira Copyright 2004 Pgina - 34 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Desempenho do Quicksort no pior caso Quanto tempo o algoritmo consome no pior caso? Digamos que PARTICIONE consome no mais que 7n+3 unidades de tempo, onde n = r-p+1. Ento o consumo de tempo do QUICKSORT no pior caso, digamos T(n), satisfaz a recorrncia T(1) T(n) <= = 7n + 4 + maxk (T(k) + T(n-k)) , 1 para n = 2, 3, . . .

onde o mximo tomado sobre todos os possveis valores de k no intervalo 1..n-1. Assim, por exemplo, T(2) <= 14+4+T(1)+T(1) = 20. Outro exemplo: T(3) <= 21+4+T(1)+T(2) <= 46. Mais um exemplo: T(4) <= 28+4+T(1)+T(3) <= 79, uma vez que T(1)+T(3) = 47 > 40 = T(2)+T(2). Em geral, vamos mostrar que T(n) <= 7n2

para n = 2, 3, . . . A desigualdade certamente verdadeira quando n = 2. Agora suponha que n > 2 e suponha que a desigaldade vale para T(k) sempre que k < n. Teremos ento T(n) <= 7n + 4 + maxk (T(k) + T(n-k)) <= 7n + 4 + 7 maxk (k2 + (n-k)2) <= 7n + 4 + 7 (1 + (n-1)2) <= 7n2 - 7n + 18 <= 7n2 pois n >= 3. Observe que o pior caso ocorre quando k vale 1 ou n-1, ou seja, quando PARTICIONE devolve p ou devolve r-1. Se deixarmos de lado a hiptese grosseira de que cada linha "simples" do algoritmo consome 1 unidade de tempo, as concluses ainda sero as mesmas: a recorrncia ser T(n) <= max0 < k < n (T(k) + T(n-k)) + O(n) ,

e da se deduz, imitando o que j fizemos acima, que T(n) = O(n2).

Por outro lado, no difcil verificar que T(n) = Omega(n2): basta supor que o vetor A[p..r] que o algoritmo recebe j est em ordem estritamente crescente. Nesse caso, PARTICIONE devolve q = p e a recorrncia se reduz a T(n) = T(1) + T(n-1) + O(n). Ademais, tanto A[p..q] quanto A[q+1..r] so crescentes. Concluso: O desempenho de pior caso do QUICKSORT decepcionante. Por que ento o algoritmo to popular? Desempenho mdio do Quicksort: preliminares O consumo de tempo mdio do QUICKSORT bem melhor que O(n2). A verificao rigorosa deste fato no fcil, mas a idia intuitiva simples: o consumo de tempo s chega perto de n2 quando o valor de q devolvido por PARTICIONE est sistematicamente muito prximo de p ou de r-1. A intuio sugere que isso deve ser raro. Vamos fazer alguns clculos grosseiros para adquirir alguma intuio sobre o comportamento mdio do QUICKSORT. Suponha inicialmente que PARTICIONE sempre devolve um ndice que
Prof. Cristiano Vieira Copyright 2004 Pgina - 35 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

est a meio caminho entre p e r, ou seja, o vetor A[p..r] dividido na proporo 1-para-1. Ento o consumo de tempo, digamos T(n), do algoritmo satisfaz a recorrncia T(1) T(n) = 1 <= T(cho(n/2)) + T(teto(n/2)) + 7n + 4 para n = 2, 3, . . .

Para simplificar, vamos resolver uma recorrncia semelhante, que no tem cho nem teto. Para compensar a ausncia do cho e teto preciso estender a funo a todos os nmero racionais positivos: f(n) f(n) = 1 para n <= 1 <= f(n/2) + f(n/2) + 7n + 4 para n > 1.

fcil verificar que f(n) <= 10 n log2(n) para n >= 2. Ou seja, f(n) = O(n log(n)). Agora suponha que PARTICIONE divide o vetor na proporo 8-para-1. Ento o consumo de tempo do QUICKSORT obedece uma recorrncia semelhante seguinte: g(n) g(n) = 1 para n <= 1 <= g(n/9) + g(8n/9) + 7n + 4 para n > 1.

(Estamos sendo forados a trabalhar com todos os valores racionais de n para que a recorrncia faa sentido.) Por exemplo, g(9/8) <= g(1/8)+g(1)+63/8+4 = 1+1+63/8+4 = 111/8. Eu gostaria de mostrar que g(n) <= 13 n log9/8(n)

para todo n >= 9/8. (A base dos logaritmos 9/8 apenas para simplificar alguns clculos.) A desigualdade de fato vale para n = 9/8 pois g(9/8) = 111/8 enquanto 13 n log9/8(n) = 117/8. Agora suponha que n > 9/8. Ento, por hiptese de induo, e usando sempre log na base 9/8,

Prof. Cristiano Vieira

Copyright 2004

Pgina - 36 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

5. Modularizao

Para construirmos grandes programas, necessitamos fazer uso da tcnica de modularizao. Esta tcnica faz com que dividamos um grande programa em pequenos trechos de cdigo, onde cada qual tem uma funo bem definida. Assim, alm da facilidade em lidar com trechos menores, ainda podemos fazer uso da reutilizao de cdigo, j que estes trechos devem ser bem independentes. Assim, definimos mdulo como um grupo de comandos, constituindo um trecho de algoritmo, com uma funo bem definida e o mais independente possvel em relao ao resto do algoritmo. A maneira mais intuitiva de trabalharmos com a modularizao de problemas definirse um mdulo principal de controle e mdulos especficos para as funes do algoritmo. Mdulos de um programa devem ter um tamanho limitado, j que mdulos muito grandes so difceis de serem compreendidos. Os mdulos so implementados atravs de procedimentos ou funes.

5.1 Procedimentos Determina um trecho de algoritmo/programa que ser executado somente no momento que o mdulo principal necessitar. Sintaxe de definio de um procedimento: Procedimento Nome_do_Procedimento [ (parmetros) ]; <declarao das variveis locais> sentena 1; sentena 2; sentena n; Retorno Os parmetros podem ser passados por valor ou por referncia. Um parmetro passado por valor, no pode ser alterado pelo procedimento. Os parmetros por referncia so identificados usando-se o simbolo * antes de sua declarao. Sintaxe da chamada do procedimento: Nome_do_Procedimento (<lista de armetros>); Os valores passados como parmetros na chamada de um procedimento, devem corresponder sequencialmente ordem declarada.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 37 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

5.2 Funo

Semelhante ao procedimento, todavia sua diferena consiste no fato de que um procedimento no retorna valor quando chamado para execuo, enquanto que a funo retorna um valor. Definio de uma funo: Funo Nome_Funo [ (parmetros) ] : valor_retorno; < declarao de variveis locais > sentena 1; sentena 2; sentena n; Retorno varivel;

Chamada da funo: Nome_Funo (<lista de parmetros>); Ou Varivel Nome_Funo (<lista de parmetros>);

Exemplos: a) Procedimento INICIO Inteiro: A, B; Leia(A,B); Maior(A,B); FIM. Procedimento Maior(X,Y) Inteiro: X, Y; Se X > Y ento Escreva(X); Seno Escreva(Y); Fim-se; Retorno; Funo Dobro(Z) Inteiro W, Z; W Retorno W; Z * 2; FIM. b) Funo INICIO Inteiro: R, S; Leia(S); R Dobro(S);

Escreva(R);

Prof. Cristiano Vieira

Copyright 2004

Pgina - 38 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

6. Variveis Locais, Globais e Ponteiros Determinam o modo na qual sero disponibilizadas as variveis (contedo e/ou endereo) durante o processo de modularizao do algoritmo/programa. 6.1 Variveis Locais Somente possuem seu valores dentro do procedimento/funo que forma declaradas. Exemplos: INICIO Inteiro: R; R 5; INICIO Inteiro: R; R 5;

Leitura(); Escreva(R, X); FIM. Procedimento Leitura() Caracter: R, X; Leia(R,X); Escreva(R,X); Retorno; FIM.

Leitura(); Escreva(R, X); Funo Leitura() Caracter: R, X; Leia(R,X); Escreva(R,X); Retorno X;

6.2 Variveis Globais ou Pblicas: Uma vez declarada, seus valores so mantidos por todo algoritmo/programa e no precisam ser passadas a outros procedimentos/funo por parmetro. Exemplo:

INICIO Inteiro Global: R; Leitura(); Escreva(R); FIM.

INICIO Real: B; B 5;

Teste(); B FIM. B + D;

Escreva(B); Procedimento Leitura() Leia(R); Retorno; Procedimento Teste() Real Global: D; Leia(D); Retorno;

Prof. Cristiano Vieira

Copyright 2004

Pgina - 39 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

6.3 Variveis Ponteiros

6.3.1 Definio de Ponteiros Ponteiro uma varivel que contm o endereo de outra varivel ou de uma posio de memria conhecida. Se uma varivel contm o endereo de uma outra varivel, dizemos que a primeira aponta para a segunda. Atravs de uma varivel do tipo ponteiro pode-se ter acesso ao contedo de endereo de memria representado por tal varivel. Os ponteiros fornecem maneiras pelas quais as funes podem modificar os argumentos recebidos. Voc poder substitu-los por matrizes em muitas situaes para aumentar a eficincia. Alm dos ponteiros serem uma das caractersticas mais fortes da linguagem C, tambm a mais perigosa. Os ponteiros usados incorretamente podem provocar erros difceis de serem encontrados. importante observar que uma varivel do tipo ponteiro deve ser definida com o mesmo tipo de dado que ela ir enderear, isto , apontar. Significa dizer que uma varivel ponteiro, do tipo real, por exemplo, s dever apontar para dados tambm definidos como real.

6.3.2 Como Funcionam os Ponteiros Os int guardam inteiros. Os float, double guardam nmeros de ponto flutuante. Os char guardam caracteres, ponteiros guardam endereos de memria. Quando voc anota o endereo de um colega voc est criando um ponteiro. O ponteiro este seu pedao de papel. Ele tem anotado um endereo. Qual o sentido disto? Simples. Quando voc anota o endereo de um colega, depois voc vai usar este endereo para ach-lo. O C funciona assim. Voce anota o endereo de algo numa varivel ponteiro para depois usar. Da mesma maneira, uma agenda, onde so guardados endereos de vrios amigos, poderia ser vista como sendo uma matriz de ponteiros no C. Um ponteiro tambm tem tipo. Veja: quando voc anota um endereo de um amigo voc o trata diferente de quando voc anota o endereo de uma firma. Apesar de o endereo dos dois locais ter o mesmo formato (rua, nmero, bairro, cidade, etc.) eles indicam locais cujos contedos so diferentes. Ento os dois endereos so ponteiros de tipos diferentes. No C quando declaramos ponteiros ns informamos ao compilador para que tipo de varivel vamos apont-lo. Um ponteiro int aponta para um inteiro, isto , guarda o endereo de um inteiro.

6.3.3 Operadores de Ponteiros Operadores de ponteiros so importantes em C. Eles permitem que objetos sejam passados para funes, e que as funes modifiquem tais objetos. Os dois operadores de ponteiros so: & e *.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 40 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

6.3.3.1

& ( operador de endereo )

Retorna o endereo da varivel que precede, no o valor da varivel. Por exemplo, se o inteiro num est localizado no endereo 1000, ento y = &num; coloca em y o endereo de memria da varivel num. O smbolo & pode ser lido como o endereo de . A declarao y = &num pode ser lida como : coloque o endereo de num em y , ou ento, y recebe o endereo de num. O algoritmo abaixo declara uma varivel do tipo inteiro e uma varivel do tipo real e exibe o valor e endereo de ambas : Por exemplo: Inicio inteiro a; real b; a 1; b 3.5; escreva ( Valor = , a , Endereo = , &a ); escreva ( Valor = , b , Endereo = , &b ); Fim

6.3.3.2

* (varivel ponteiro)

O valor da varivel que precede e usa este smbolo classificada como endereo da informao na memria. Por exemplo : y = *num; coloca o valor no endereo de num em y. Pode ser lido como : y recebe o valor no endereo num y = &num; *y = 1995; coloca o valor 1995 em num. O smbolo * pode ser lido como no endereo . Este exemplo poderia ser lido como : coloque o valor 1995 no endereo y . O operador * tambm pode ser usado do lado direito da declarao. Por exemplo, y = &num; *y = 1995; v = *y / 10; coloca o valor de 199 em v. Os operadores & e * so chamados operadores de ponteiros por serem designados para trabalhar em variveis ponteiro. O comando : px = &x; utiliza o operador & que fornece o endereo. Podemos interpretar este comando como : - o operador & pode ser aplicado variveis - o operador * trata seu operando com um endereo e acessa esse endereo para buscar o contedo. A sequncia : x = &x; y = *x; atribui a y o mesmo valor atribudo no comando : y = x.
Prof. Cristiano Vieira Copyright 2004 Pgina - 41 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

6.3.3.3

Declarando e Utilizando Ponteiros

Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_varivel; o asterisco (*) que faz o compilador saber que aquela varivel no vai guardar um valor mas sim um endereo para aquele tipo especificado. Vamos ver exemplos de declaraes: int *pt; char *temp, *pt2; O primeiro exemplo declara um ponteiro para um inteiro. O segundo declara dois ponteiros para caracteres. Eles ainda no foram inicializados (como toda varivel do C que apenas declarada). Isto significa que eles apontam para um lugar indefinido. Este lugar pode estar, por exemplo, na poro da memria reservada ao sistema operacional do computador. Usar o ponteiro nestas circunstnicias pode levar a um travamento do micro, ou a algo pior. O ponteiro deve ser inicializado (apontado para algum lugar conhecido) antes de ser usado! Isto de suma importncia! Para atribuir um valor a um ponteiro recm-criado poderamos igual-lo a um valor de memria. Mas, como saber a posio na memria de uma varivel do nosso programa? Seria muito difcil saber o endereo de cada varivel que usamos, mesmo porque estes endereos so determinados pelo compilador na hora da compilao e realocados na execuo. Podemos ento deixar que o compilador faa este trabalho por ns. Para saber o endereo de uma varivel basta usar o operador &. Veja o exemplo: int count=10; int *pt; pt=&count; Criamos um inteiro count com o valor 10 e um apontador para um inteiro pt. A expresso &count nos d o endereo de count, o qual armazenamos em pt. Simples, no ? Repare que no alteramos o valor de count, que continua valendo 10. Como ns colocamos um endereo em pt, ele est agora "liberado" para ser usado. Podemos, por exemplo, alterar o valor de count usando pt. Para tanto vamos usar o operador "inverso" do operador &. o operador *. No exemplo acima, uma vez que fizemos pt=&count a expresso *pt equivalente ao prprio count. Isto significa que, se quisermos mudar o valor de count para 12, basta fazer *pt=12. Digamos que exista uma firma. Ela como uma varivel que j foi declarada. Voc tem um papel em branco onde vai anotar o endereo da firma. O papel um ponteiro do tipo firma. Voc ento liga para a firma e pede o seu endereo, o qual voc vai anotar no papel. Isto equivalente, no C, a associar o papel firma com o operador &. Ou seja, o operador & aplicado firma equivalente a voc ligar para a mesma e pedir o endereo. Uma vez de posse do endereo no papel voc poderia, por exemplo, fazer uma visita firma. No C voc faz uma visita firma aplicando o operador * ao papel. Uma vez dentro da firma voc pode copiar seu contedo ou modific-lo.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 42 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

7. Aplicao de variveis dimensionadas heterogneas

7.1 Registros e Campos O conceito de registro visa facilitar o agrupamento de variveis que no so do mesmo tipo, mas que guardam estreita relao lgica. Assim, registros correspondem a uma estrutura de dados heterognea, ou seja, permite o armazenamento de informaes de tipos diferentes. So localizados em posies de memria, conhecidos por um mesmo nome e individualizados por identificadores associados a cada conjunto de posies, os campos. Vamos pensar que precisamos fazer um algoritmo que leia os dados cadastrais dos funcionrios de uma empresa. Somente com os campos nome e salrio j temos uma divergncia de tipos caracter e real. Assim, precisamos de uma estrutura de dados que permita armazenar valores de tipos de diferentes estamos diante dos registros. Nas matrizes, a individualizao de um elemento feita atravs de ndices, j no registro cada elemento individualizado pela referncia do nome do campo. Veja a sintaxe da declarao de um registro:

Registro: Nome_Registro Tipo: Nome_do_Campo; Tipo: Nome_do_Campo; ... Tipo: Nome_do_Campo; Fim-registro;

Para trabalharmos com um registro, devemos primeiramente criar um tipo registro. Depois, declaramos uma varivel cujo tipo ser este tipo registro. A sintaxe que representa o acesso ao contedo de um campo do registro : nome_registro.nome_campo; A atribuio de valores aos registros feita da seguinte forma: nome_registro.nome_campo valor; Exemplo:

Registro: data Inteiro: dia; Caracter: mes; Inteiro: ano; Fim-registro Escreva (Qual o dia?); Leia (data.dia); Escreva (Qual o mes?); Leia (data.mes); Escreva (Qual o ano?); Leia (data.ano); Escreva(A data informada ,data.dia,/, data.mes,/, data.ano)

Prof. Cristiano Vieira

Copyright 2004

Pgina - 43 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Suponha uma aplicao onde devemos controlar os dados de funcionrios da empresa. Imagine que tenhamos fichas onde os dados esto logicamente relacionados entre si, pois constituem as informaes cadastrais do mesmo indivduo. NOME DO FUNCIONRIO ENDEREO

JOO DA SILVA

RUA DA SAUDADE, 100 CASA 1

CPF

ESTADO CIVIL

DATA NASCIMENTO

ESCOLARIDADE

000.001.002-

CASADO

01/01/1960

SUPERIOR

CARGO

SALRIO

DATA DE ADMISSO

GERENTE DE

1000,00

10/05/1997

Cada conjunto de informaes do funcionrio pode ser referencivel por um mesmo nome, como por exemplo, FUNCIONARIO. Tais estruturas so conhecidas como registros e aos elementos do registro d-se o nome de campos. Assim, definiramos um registro da seguinte forma: Registro: Funcionario Caracter: nome; Caracter: endereco; Caracter: cpf; Caracter: estado_civil; Caracter: data_nascimento; Caracter: escolaridade; Caracter: cargo; Real: salario; Caracter: data_admissao; Fim-registro;

Prof. Cristiano Vieira

Copyright 2004

Pgina - 44 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

8. Arquivos Na maioria das vezes, desejaremos desenvolver um algoritmo de forma que os dados manipulados sejam armazenados por um perodo longo de tempo, e no somente durante o tempo de execuo do algoritmo. Como a memria principal do computador voltil, ou seja, ao ser desligado o computador, todos os dados da memria so perdidos, necessitamos de uma memria auxiliar que seja permanente, como por exemplo, um disquete ou o disco rgido (HD). Assim, passamos a ter um novo conceito no mundo computacional o de arquivos. Arquivo um conjunto de registros armazenados em um dispositivo de memria auxiliar (secundria). Por sua vez, um registro consiste de um conjunto de unidades de informao logicamente relacionadas os campos. Assim, podemos definir que um registro corresponde a um conjunto de campos de tipos heterogneos. Veja que neste momento estamos tratando de registros fsicos, ao contrrio, do que vimos no item anterior, que so os registros lgicos. O fato do arquivo ser armazenado em uma memria secundria, o torna independente de qualquer algoritmo, isto , um arquivo pode ser criado, consultado, processado e eventualmente removido por algoritmos distintos. Sendo o arquivo uma estrutura fora do ambiente do algoritmo, para que este tenha acesso aos dados do arquivo necessria a operao de leitura do registro no arquivo. As operaes bsicas que podem ser feitas em um arquivo atravs de um algoritmo so: obteno de um registro, insero de um novo registro, modificao ou excluso de um registro. A disposio dos registros no arquivo organizao oferece ao programador formas mais eficientes e eficazes de acesso aos dados. Vamos considerar, aqui, as duas principais formas de organizao de arquivos: a seqencial e a direta. Organizao Seqencial: A principal caracterstica da organizao seqencial a de que os registros so armazenados um aps o outro. Assim, tanto a leitura quanto a escrita, so feitas seqencialmente, ou seja, a leitura de um determinado registro s possvel aps a leitura de todos os registros anteriores e a escrita de um registro s feita aps o ltimo registro. Organizao Direta: A principal caracterstica da organizao direta a facilidade de acesso. Para se ter acesso a um registro de um arquivo direto, no necessrio pesquisar registro a registro, pois este pode ser obtido diretamente acesso aleatrio. Isto possvel porque a posio do registro no espao fsico do arquivo univocamente determinada a partir de um dos campos do registro (chave), escolhido no momento de criao do arquivo. O acesso a um arquivo dentro do algoritmo feito atravs da leitura e escrita de registros. No algoritmo, o arquivo deve ser declarado e aberto, antes que tal acesso possa ser feito. No final do algoritmo, ou quando houver necessidade, o arquivo deve ser fechado. A sintaxe da declarao de arquivos : arquivo: nome_arquivo (nome_registro, organizao); onde: nome_registro nome do registro lgico que ser usado para se ter acesso aos registros fsicos do arquivo. organizao indica o tipo de organizao do arquivo, que pode ser seqencial ou direta.
Prof. Cristiano Vieira Copyright 2004 Pgina - 45 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

Exemplo: Registro: Registro_Endereco Caracter: rua, bairro, cidade, uf, cep; Inteiro: numero; Fim-registro; Arquivo: Agenda (Registro_Endereo, Seqencial);

8.1 Abertura de Arquivos A declarao do arquivo a definio, para o algoritmo, do modelo e dos nomes que estaro associados estrutura de dados, isto , ao arquivo. A sintaxe da declarao de arquivos : Abrir (nome_ arquivo, tipo_abertura) ; onde: tipo_abertura especifica se o arquivo ser usado para: - leitura - escrita - leitura/escrita (caso no seja especificado o tipo_abertura este ser automaticamente acionado) Exemplo: Abrir Abrir Abrir Abrir (Agenda, leitura); (Agenda, escrita); (Agenda); (Agenda, Contas_Pagar);

8.3 Fechamento de Arquivos Para se desfazer a associao entre o modelo e o arquivo fsico, usa-se o comando de fechamento de arquivos, cuja sintaxe est a seguir: Fechar (nome_ arquivo);

8.4 Visualizao dos dados de Arquivos Para ver os dados armazenados dentro de um arquivo usa-se a sintaxe a seguir: Escrever ( nome_arquivo );

8.5 Inserindo dados em Arquivos Para gravar as informaes dos registros dentro de um arquivo de dados usa-se a sintaxe de comando seguir: Inserir/Gravar ( nome_arquivo); Usamos o comando Inserir quando os dados ainda no existem no arquivo, e Gravar quando estamos alterando algo que j existe dentro do arquivo.
Prof. Cristiano Vieira Copyright 2004 Pgina - 46 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

8.6 Pesquisa de registro num arquivo Para encontrar informaes sobre registros dentro de um arquivo de dados usa-se a sintaxe de comando seguir: Pesquisar ( nome_arquivo.nome_campo, valor); Exemplo: Algoritmo Pesquisa1 Inicio // declaraes Inteiro: mat; Lgico: Encontrou; Registro: Dados_Aluno Inteiro: matricula; Caracter: nome, data_nascimento, endereco; fim-registro; Arquivo: Alunos( Dados_Alunos, Seqencial ); Abrir (Alunos, leitura); Encontrou Falso; Escreva ( Qual o nmero de matricula que deseja procurar? ); Leia ( mat ) Se Pesquisar( Alunos.Matricula , mat ) ento Escrever(Aluno encontrado); Fim-se; Fechar Alunos; Fim

Prof. Cristiano Vieira

Copyright 2004

Pgina - 47 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

9. Tabela ASCII

Prof. Cristiano Vieira

Copyright 2004

Pgina - 48 -

FEPI Colgio Universitas

Introduo a Lgica de Programao

10. Referncias Bibliogrficas

SEBESTA, Robert W. Conceitos de linguagem de programao, 4 edio. Editora Bookman, ano 2000.

FARRER, Harry, BECKER, Christiano G., FARIA, Eduardo C., MATOS, Helton Fbio de, SANTOS, Marcos Augusto dos, MAIA, Miriam Loureno. Algoritmos Estruturados. Editora Guanabara, 1989. GUIMARES, Angelo de Moura, LAGES, Newton A de Castilho. Algoritmos e estruturas de dados. Rio de Janeiro. LTC Livros Tcnicos e Cientficos Editora, 1985. SALVETTI, Dirceu Douglas, BARBOSA, Lisbete Madsen. Algoritmos. Editora Makron Books, 1998. SILVA, Joselias Santos da. Concursos Pblicos Raciocnio Lgico. R&A Editora Cursos e Materiais Didticos, 1999. WIRTH, Niklaus. Algoritmos e Estruturas de Dados. Editora Prentice-Hall do Brasil, 1986. SILVA, Cristiano Vieira. Apostila de Algoritmos Introduo a Lgica de Programao, Colgio Universitas Cursos Tcnico em Informtica. Edio particular, publicao 2004 A utilizao deste material ser somente sob autorizao e a fonte dever ser citada.

Prof. Cristiano Vieira

Copyright 2004

Pgina - 49 -

Вам также может понравиться