Prof. Jorge Cavalcanti

Documentos relacionados
algoritmo "exercício 28" var opcao, n1, n2: inteiro funcao seleciona_opcao():inteiro var o:caractere inicio repita escreva ("Efetue uma multiplicação

Estruturas de dados homogêneas

Prof. Jorge Cavalcanti

Algoritmos e Programação

Introdução a Algoritmos Parte 06

ALGORITMOS I. Procedimentos e Funções

Prof. Jorge Cavalcanti

Conceitos básicos de algoritmos

Pseudocódigo Exercício 6

Algoritmos e Programação

Algoritmos e Programação

Conceitos Básicos de Algoritmos

Pseudocódigo Exercício 6

Recursividade Alguns problemas são definidos com base nos mesmos, ou seja, podem ser descritos por instâncias do próprio problema.

Algoritmo e Programação. Capítulo 2 Tópicos Preliminares

Algoritmo e Programação Matemática

algoritmo "exercício 5" var x, y, aux: inteiro inicio escreva ("Entre com um valor inteiro p/ variável x: ") leia (x) escreva ("Entre com um valor

Estruturas de Controle de Fluxo

Prof. Jorge Cavalcanti

Programação Estruturada Aula VisualG

n1, /,n2, =,res n1, n2, res: real res <- n1 / n2 Digite o Dividendo: n2<>0 Digite o Divisor: verdadeiro falso

Estruturas de Controle de Fluxo

Estruturas de Controle de Fluxo Estruturas de Seleção. Givanaldo Rocha

Fluxograma. Símbolo Nome Descrição

Método para Construção de Algoritmos

Conceitos Básicos. Professor: Juliano Lucas Gonçalves.

Pseudocódigo Exercício 2

Fundamentos de Programação 1

Funções e procedimentos. Lógica de programação Professor Leo Larback

Introdução ao VisuALG

LÓGICA DE PROGRAMAÇÃO. Algoritmos Computacionais. Sérgio Carlos Portari Júnior

ALGORITMOS E PROGRAMAÇÃO. Andreza Leite Andreza.leite@univasf.edu.br

Algoritmos I Aula 5 Visualg

Disciplina: Algoritmos e Programação Professor: Paulo César Fernandes de Oliveira, BSc, PhD

Algoritmos e Programação

Fig. 1: Ilustração de um exemplo de Modularização de um guindaste em suas partes Fonte: Internet

algoritmo "exercício vetor" var vet:vetor [1..12] de inteiro i:inteiro inicio para i de 1 ate 12 faca escreva ("Entre com vetor[",i,"]: ") leia

INFORMÁTICA APLICADA AULA 06 ALGORITMOS

Aula 11: Modularização

Português Estruturado (VISUALG)

MATRIZES - PARTE Definição e Manipulação de Matrizes AULA 21

Aula 16 Estruturas de Controle. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

PROGRAMAÇÃO COMPUTACIONAL I

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Fluxograma. Símbolo Nome Descrição

Aplicaremos a técnica do teste de mesa sobre o algoritmo abaixo, o qual visa determinar o número de vértices de uma figura geométrica.

Algoritmos - 2. Alexandre Diehl. Departamento de Física - UFPel

AULA 13 PROCEDIMENTOS. Disciplina: Algoritmos e POO Professora: Alba Lopes.

Pseudocódigo e visualg

Algoritmos - 1. Alexandre Diehl. Departamento de Física - UFPel

Portugol. Tiago Alves de Oliveira

ALGORITMOS E LÓGICA DE PROGRAMAÇÃO PRÉ AULA DIAGNÓSTICO 22/10/2015. Analise o algoritmo a seguir e depois assinale a alternativa correspondente:

TIPOS DE DADOS E VARIÁVEIS

algoritmo "exercício 22 resposta incorreta" var A, i: inteiro eh_primo: logico inicio repita escreva ("Entre com um valor inteiro positivo: ") leia

Estruturas de Controle de Fluxo

ET51D - INFORMÁTICA. Algoritmos - Estruturas de Decisão. Professor: Glauber G. O. Brante.

1. Escreva um algoritmo em fluxograma que descreva a sequência 1, 5, 13, 17, 21, 25,?,?,?,?. Ou seja, até o seu 10º termo.

Fundamentos de Programação 1

ALGORITMOS AULA 2. Profª Amanda Gondim

Processamento Sequencial e Condicional

Estruturas de controle: Estrutura de DECISÃO

Fundamentos de Programação 1

Resumo VISUALG. A seção de declaração de variáveis começa com a palavra-chave var, e continua com as seguintes sintaxes:

PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA

ALGORITMOS E LÓGICA DE PROGRAMAÇÃO PRÉ AULA PRÉ AULA 31/08/2015

Introdução a Algoritmos Parte 04

Noções de algoritmos - Aula 1

Estruturas de Controle de Fluxo Pseudocódigo/Exercício Construa o pseudocódigo de um algoritmo para obter o resultado da divisão de dois números

EXPRESSÕES ARITMÉTICAS PARTE 1

COMANDOS DE REPETIÇÃO (ENQUANTO, REPITA E PARA)

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

CAPÍTULO 3 INSTRUÇÕES BÁSICAS

9. Comando de repetição com variável de controle (para.. de.. até.. faça)

Exercícios Repetição

Explicação do programa:

algoritmo "exercício 13" var op1, op2: real operador: caractere inicio escreva ("Entre com o primeiro operando: ") leia (op1) escreva ("Entre com o

Introdução ao VisuALG

Transcrição:

Universidade Federal do Vale do São Francisco Curso de Engenharia de Computação Introdução a Algoritmos Parte 05 Prof. Jorge Cavalcanti jorge.cavalcanti@univasf.edu.br www.univasf.edu.br/~jorge.cavalcanti www.twitter.com/jorgecav 1

Modularização Com o avanço do estudo sobre algoritmos os problemas a serem solucionado aumentam em complexidade. Um método de resolução de problemas complexos é visualizá-los como compostos por problemas menores e tratar um a um os subproblemas identificados. Podemos desta forma construir um algoritmo composto por subalgoritmos denominados módulos. Esta metodologia é denominada top-down (de cima para baixo), ou melhor, do genérico para o específico. 2

Modularização Desta forma ao nos depararmos com um problema complexo devemos buscar visualizálo como um conjunto de problemas mais simples. Trataremos agora de como construir um algoritmo composto por módulos. Assim como um algoritmo, que em geral possui um conjunto de entradas, efetua um processamento e gera um conjunto de saídas, um módulo também funciona da mesma forma. 3

Da mesma forma com que o pseudocódigo define uma estrutura para construção de algoritmos, também é especificada uma estrutura para construção de módulos. Trabalharemos com dois tipos de módulos: A função; O procedimento. Conceito de função. Uma função é um módulo que possui ou não um conjunto de entradas, efetua a execução de um conjunto de instruções e sempre gera um valor como saída, também denominado retorno. 4

A estrutura de uma função é a seguinte: funcao <nome_da_função> ([<seqüência-de-declaraçõesde-parâmetros>]) : <tipo_de_dado> // Seção de Declarações Internas // Seção de Comandos fimfuncao Obs.: A declaração de uma função deve estar entre o final da declaração de variáveis e a linha contendo no algoritmo principal. 5

O tipo_de_dado é o tipo do valor que a função vai retornar. A seqüência-de-declarações-de-parâmetros é uma lista com a seguinte forma geral: identificador1: tipo_de_dado; identificador2: tipo_de_dado;...; identificadorn: tipo_de_dado Repare que o tipo_de_dado deve ser especificado para cada uma das N variáveis definidas como parâmetros, independente de mais de uma variáveis ser do mesmo tipo_de_dado. É na declaração de parâmetros que informamos quais serão as entradas da função (assim como informamos a saída no tipo_de_dado associado à função). 6

Em um módulo, assim como em um algoritmo, podemos declarar variáveis que serão utilizadas nas manipulações efetuadas. Para esta finalidade existe a Seção de Declarações Internas. As regras para construção do nome_da_função são as mesmas aplicadas na definição dos identificadores de variáveis. Por fim, é na Seção de Comandos também denominado corpo da função que as entradas são processadas, saídas são geradas e/ou outras operações são feitas. 7

Comando retorne Forma geral: retorne valor_de_retorno Quando se executa um comando retorne a função é encerrada imediatamente e o valor de retorno é retornado pela função. É importante lembrar que o valor de retorno fornecido tem que ser compatível com o tipo de retorno declarado para a função. 8

Exemplo de função: algoritmo "exemplo1 função" var num:inteiro funcao quadrado (a: inteiro): inteiro retorne (a*a) fimfuncao escreva ("Entre com um número inteiro: ") leia (num) num <- quadrado(num) escreva ("O seu quadrado vale: ",num) fimalgoritmo 9

Exemplo de função: algoritmo "exemplo2 função" var num:inteiro funcao quadrado (a: inteiro): inteiro retorne (a*a) fimfuncao escreva ("Entre com um número: ") leia (num) escreva ("O quadrado de ",num) escreva (" é ", quadrado(num)) fimalgoritmo 10

Exercício Construa uma função capaz de receber um número inteiro como parâmetro e retornar se este é ou não um número impar. Resposta: funcao eh_impar (a: inteiro): logico retorne (a%2<>0) fimfuncao 11

Exercício: Resposta alternativa: funcao eh_impar (a: inteiro): caractere se (a%2<>0) entao retorne ("O número é impar.") senao retorne ("O número é par.") fimse fimfuncao 12

13 Caso o problema anterior estivesse da seguinte forma: Construa uma função que receba um número inteiro e retorne se este é ou não um número impar. Algo mudaria com relação à interpretação? Sim. Neste caso não estaria especificado se a função receberia o número através de um parâmetro ou se este seria lido através da entrada padrão. Logo, a seguinte solução também seria correta: funcao eh_impar (): logico var n:inteiro escreva ("Entre com um valor inteiro: ") leia (n) retorne (n%2<>0) fimfuncao //a chamada da função eh_impar deve ser //feita da seguinte forma: eh_impar()

Exercício Utilizando-se do conceito de Modularização construa um algoritmo que resolva o problema de obter as raízes reais de uma equação do segundo grau, caso existam raízes reais. 14

15 algoritmo "Calcular Raízes" var a, b, c, d: real funcao calcular_delta(a:real; b:real; c:real):real retorne (b^2-4*a*c) fimfuncao escreva("algoritmo que calcula as raízes reais ") escreval ("de uma equação do tipo: ax^2+bx+c") repita escreva ("Entre com o valor de a: ") leia (a) ate (a<>0) escreva ("Entre com o valor de b: ") leia (b) escreva ("Entre com o valor de c: ") leia (c) d<-calcular_delta(a,b,c) se (d<0) entao escreva ("A equação não possui raízes reais.") senao escreval ("x1 =",(-b+d^0.5)/(2*a)) escreval ("x2 =",(-b-d^0.5)/(2*a)) fimse fimalgoritmo

Exercício Construa um algoritmo que receba, como parâmetro, um número inteiro positivo, o qual representa a posição de um determinado termo na série de Fibonacci, a função deve retornar o valor do termo correspondente à posição recebida.

Atividade para a próxima aula. Construa um algoritmo que tenha a capacidade de efetuar uma multiplicação entre valores naturais quaisquer e a capacidade de calcular o fatorial de um número natural qualquer. Tanto no cálculo da multiplicação quanto no cálculo do fatorial os únicos operadores aritméticos que podem ser utilizados são os de soma e subtração. O algoritmo em questão deve possibilitar ao usuário fazer a seleção de qual operação será realizada. As entradas devem ser validadas e o conceito de modularização deve ser aplicado.

Procedimento Um procedimento é um módulo que possui ou não um conjunto de entradas, efetua a execução de um conjunto de instruções e não gera um valor como saída, ou seja, não apresenta retorno. 18

A estrutura de um procedimento é a seguinte: procedimento<nome_do_procedimento> ([<seqüência-de-declarações-de-parâmetros>]) // Seção de Declarações Internas // Seção de Comandos fimprocedimento Obs.:A chamada de um procedimento sem parâmetro segue a mesma regra aplicada à chamada de uma função sem parâmetro. 19

A <seqüência-de-declarações-de-parâmetros> é uma lista com a seguinte forma geral: identificador1: tipo_de_dado; identificador2: tipo_de_dado;...; identificadorn: tipo_de_dado Assim como na função o tipo_de_dado deve ser especificado para cada uma das N variáveis definidas como parâmetros. É na declaração de parâmetros que informamos quais serão as entradas do procedimento. Como um procedimento é um módulo, também podemos declarar, na Seção de Declarações Internas, variáveis que serão utilizadas nas manipulações efetuadas. 20

As regras para construção do nome_do_procedimento são as mesmas aplicadas na definição dos identificadores de variáveis. Por fim, é na Seção de Comandos, também denominado corpo do procedimento, onde as entradas são processadas e demais operações são feitas. Exemplo de procedimento: algoritmo "exemplo procedimento" procedimento frase() escreval ("Ola! Eu estou vivo.") fimprocedimento frase() escreval ("Diga de novo:") frase() fimalgoritmo 21

Exercício Construa um procedimento que escreve no monitor a mesma frase 10 vezes. O alinhamento que deve ser obedecido para a escrita das frases é apresentado a seguir: Sou um procedimento! Sou um procedimento! Sou um procedimento!... 22

Escopo de variáveis Com a introdução do conceito de módulo passou a ser possível, além de declarar variáveis no algoritmo principal, declarar variáveis nos módulos, seja como parâmetros ou dentro dos mesmos. Desta forma tornou-se necessário o estabelecimento de regras que normatizassem a visibilidade das variáveis, estabelecendo-se o conceito de escopo de variáveis. O escopo de variáveis é o conjunto de regras que determinam a validade de variáveis nas diversas partes do algoritmo, ou seja, onde cada uma das variáveis pertencentes ao algoritmo existe estando disponível para manipulação. 23

Variáveis locais Variáveis locais são aquelas que só têm validade dentro do módulo no qual são declaradas. algoritmo "exemplo" funcao func1 (...):inteiro var abc,x,z:inteiro... fimfuncao funcao func2 (...):logico var z:inteiro... fimfuncao... fimalgoritmo 24

Variáveis globais Variáveis globais são declaradas na seção de declarações de variáveis do algoritmo. Elas são conhecidas e podem ser alteradas por todas os módulos que constituem o algoritmo. Quando um módulo tem uma variável local ou um parâmetro com o mesmo nome de uma variável global o módulo dará preferência à variável local ou o parâmetro. 25

- Variáveis globais Exemplo: algoritmo "exemplo" var j:inteiro procedimento f1(i: inteiro) j<-18 i<-17 escreval (i) fimprocedimento j<-3 f1(j) escreva (j) fimalgoritmo 26

- Variáveis globais Exemplo: algoritmo "exemplo" var i:inteiro procedimento f1(i: inteiro) i<-18 escreval (i) fimprocedimento i<-3 f1(i) escreva (i) fimalgoritmo 27

Parâmetros Os parâmetros são declarados entradas de um módulo. como sendo as Um parâmetro é uma variável local do módulo que é inicializada com um valor externo ao módulo. Existem dois tipos de passagem de parâmetro para um módulo: A passagem de parâmetro por valor; Passagem de parâmetro por referência. Em todos os módulos usados até o momento utilizamos da passagem de parâmetro por valor. Ou seja, em todas as aplicações que utilizamos o conceito de módulo sempre ao chamarmos o módulo que pretendíamos executar passávamos para o mesmo variáveis ou constantes que, respectivamente, continham ou representavam o valor que desejávamos inicialmente para cada um dos parâmetros do módulo. 28

Parâmetros (passagem por valor) Ao se alterar o valor de um parâmetro, passado por valor, esta alteração não terá efeito na variável que foi passada ao módulo. Isto ocorre pois quando se passa parâmetros por valor para um módulo, são copiados os valores das variáveis ou constantes para os parâmetros. Isto é, os parâmetros passados por valor existem independentemente das variáveis que foram passadas para o módulo, estes apenas são inicializados com uma cópia dos valores passados para o módulo. É esta característica, da passagem de parâmetro por valor, que possibilita a passagem de uma constante como parâmetro para um módulo. 29

Parâmetros (passagem por valor) Exemplo: algoritmo "exemplo 1" var j:inteiro procedimento f1(i: inteiro) i<-18 escreval (i) fimprocedimento j<-3 f1(j) escreva (j) fimalgoritmo 30

Parâmetros (passagem por valor) Exemplo: algoritmo "exemplo 2" var i:inteiro procedimento f1(i: inteiro) i<-18 escreval (i) fimprocedimento i<-3 f1(i) escreva (i) fimalgoritmo 31

Parâmetros (passagem por referência) Em algumas situações torna-se necessário que módulos manipulem posições de memória alocadas fora de seu escopo. Em outras palavras, torna-se necessário que módulos possam manipular variáveis com declarações externas. Uma situação onde este fato é facilmente visualizado é quando torna-se preciso que uma função retorne mais de um valor. Para atender esta necessidade existe passagem de parâmetro por referência. 32

Parâmetros (passagem por referência) Na passagem de parâmetro por referência, ao invés de ocorrer a declaração de uma variável local ao módulo e esta ser inicializada com um valor externo, ocorre apenas a passagem para o módulo da localização na memória de uma determinada variável. Em outras palavras, especifica-se que uma variável externa será visível (manipulável) dentro do módulo. Obs.: Devido à natureza da passagem de parâmetro por referência torna-se impossível a passagem de constantes para módulos que se utilizem desta modalidade de passagem de parâmetro. 33

algoritmo "Exemplo de passagem de parâmetro por referência" var a, b:inteiro procedimento troca (var x: inteiro; var y:inteiro) var aux:inteiro aux <- x x <- y y <- aux fimprocedimento escreva ("entre com a: ") leia(a) escreva ("entre com b: ") leia(b) troca(a,b) escreval ("Valor de a: ",a) escreval ("Valor de b: ",b) fimalgoritmo 34

Exemplo procedimento sem parâmetros algoritmo "procedimento sem parâmetros var n, m, res: inteiro procedimento soma var aux: inteiro // n, m e res são variáveis globais aux <- n + m // variável pode ser opcional res <- aux fimprocedimento // Seção de Comandos n <- 4 m <- 9 soma escreva(res) fimalgoritmo 35

Exemplo procedimento com parâmetros algoritmo "procedimento com parâmetros" var n, m, res: inteiro procedimento soma (x,y: inteiro) // n, m e res são variáveis globais res <- x + y fimprocedimento // Seção de Comandos n <- 4 m <- 9 soma (n,m) escreva(res) fimalgoritmo 36

Exercício: Construa uma função que receba como parâmetros dois números inteiro A e B, respectivamente, e retorne o quociente e o resto da divisão de A por B. As operações aritméticas de multiplicação, divisão, quociente da divisão inteira e resto da divisão inteira não podem ser utilizadas na construção da função. Elabore um algoritmo que se utilize de forma coerente da função construída. 37

38 Exercício: Analise o seguinte algoritmo e indique o que será impresso na saída padrão. algoritmo "exercício variável global" var num, first, sec: inteiro funcao func(first:inteiro; sec:inteiro):inteiro first <- (first+sec)\2 num <- num - first+1 retorne (first) fimfuncao first <- 0 sec <- 50 num <- 10 escreval ("num antes = ", num) escreval ("first antes = ", first) escreval ("sec antes = ", sec) num <- num + func(first, sec) escreval ("num depois = ", num) escreval ("first depois = ", first) escreval ("sec depois = ", sec) fimalgoritmo