Algoritmos e Estruturas de Dados I IEC012. Procedimentos e Funções. Prof. César Melo Todos os créditos para o professor Leandro Galvão

Documentos relacionados
Algoritmos e Programação. Linguagem C Procedimentos e. Eliane Pozzebon

Métodos e Procedimentos. Prof. Jesus José de Oliveira Neto

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

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.

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

MESMO QUE ESTAS VARIÁVEIS TENHAM NOME IDÊNTICOS

ponteiros INF Programação I Prof. Roberto Azevedo

Linguagem e Técnicas de Programação

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

ALGORITMOS I. Procedimentos e Funções

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Modularização: Funções em C

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

6 Alguns conceitos e comandos em programação

Linguagem de Programação I. Aula 10 Funções

Modularidade - Fun ções e Procedimentos

Variáveis primitivas e Controle de fluxo

Programação: Vetores

Métodos Computacionais

Módulo 5 Vetores e Alocação Dinâmica

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Linguagem C Funções. André Tavares da Silva.

Subprogramas. (ou Sub-rotinas) em C: Procedimentos e Funções. 2015/1 Programação Básica de Computadores (INF 09325)

SSC INTRODUÇÃO À COMPUTAÇÃO PARA ENGENHARIA AMBIENTAL MODULARIZAÇÃO. Profa. Dra. Milena Guessi Margarido

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Linguagem C: Introdução

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Argumentos da linha de comando Exemplos Recursividade de funções Exemplos

Controlo de Execução. K&R: Capitulo 3

Algoritmos e Estruturas de Dados I. Passagem de Parâmetros. Pedro O.S. Vaz de Melo

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Material preparado pela profa Silvana Maria Affonso de Lara

INF 1007 Programação II

Algoritmos e Estruturas de Dados I 01/2013. Vetores e Recursividade. Pedro O.S. Vaz de Melo

Funções em C. Lucas Ferrari de Oliveira Professor Adjunto. Linguagem de Programação Estruturada I. Universidade Federal do Paraná

DAS5102 Fundamentos da Estrutura da Informação

Funções. Prof. Fabrício Olivetti de França

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

Linguagem C Princípios Básicos (parte 1)

Recursividade. Objetivos do módulo. O que é recursividade

Programação de Computadores II. Cap. 5 Vetores

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI

1 Exercícios com ponteiros

Introdução a Programação de Jogos

Linguagens de Programação Aula 11

Linguagem C: Elementos fundamentais

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Material sobre Funções AEDS 1

Subprogramas. Prof. Carlos Lopes

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

INTRODUÇÃO À LINGUAGEM C. Prof. Msc. Luis Filipe Alves Pereira 2015

Fundamentos de Programação. Linguagem C++ aula II - Variáveis e constantes. Prof.: Bruno Gomes

Estruturas de Repetição

Ambiente de desenvolvimento

EXERCÍCIO DE SONDAGEM TURMA 01 SEMESTRE DATA: 01/11/2016. Matrícula Nome Nota

Revisão: Tipo Abstrato de Dados Recursividade

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Encapsulamento de Código: Funções e Procedimentos

O que é um apontador em C (type pointer in C)?

Linguagem C: diretivas, compilação separada. Prof. Críston Algoritmos e Programação

3. Linguagem de Programação C

LISTA DE EXERCÍCIOS MÊS 04

Universidade Estadual do Maranhão Curso de Engenharia da Computação Mestrado em Engenharia da Computação e Sistemas

Linguagem de Programação C

ESTRUTURAS COMPOSTAS VETOR

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Linguagem C: funções e ponteiros. Prof. Críston Algoritmos e Programação

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

Introduzir o conceito de préprocessamento e apresentar as duas principais diretivas utilizadas. funções em C.

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Conceitos Básicos Linguagem C

12 - Dados Estruturados Vetores, Matrizes e Strings

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Linguagem de Programação. Thiago Leite Francisco Barretto

Introdução à Linguagem C

Alocação Dinâmica de Memória

Alocação Dinâmica de Memória. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Introdução à linguagem de programação C. Alexandre Mota

Programação em Linguagem C

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

controle de fluxo repetições iterativas

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

LINGUAGEM C: ARRAY: VETORES E MATRIZES

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Linguagens de Programação Conceitos e Técnicas. Amarrações

Estruturas de Dados. Revisão de Funções e Recursão. Agradecimentos

FACULDADE BATISTA MINEIRA - CST Banco de Dados Estruturas de Dados - Variáveis

Comandos de controle de fluxo: if / for / while / do while.

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

Faculdade de Computação

Alocação Dinâmica em C

Leitura e Validação de Dados I

Transcrição:

Algoritmos e Estruturas de Dados I IEC012 Procedimentos e Funções Prof. César Melo Todos os créditos para o professor Leandro Galvão

Procedimentos e Funções Procedimentos são s estruturas que agrupam um conjunto de comandos que realizam operações específicas. Funções são procedimentos que retornam um valor ao seu término.

Porque utilizar procedimentos e funções? Evitam que os blocos do programa fiquem grandes demais tornando-os difíceis de ler e entender. Permitem reaproveitamento de códigos construídos anteriormente. Evitam repetição de trechos de códigos, minimizando erros e facilitando alterações.

Funções :: Como declarar <tipo> nome_da_função (<tipo> arg1, <tipo> arg2,..., <tipo> argn) { } <corpo da função> return valor_de_retorno;

Funções :: Como declarar Exemplo de uma função: int soma(int a, int b) { int c; c = a + b; return c; }

Funções :: Como declarar A Função deve ter um tipo (char, int, float), o qual indicará o tipo de seu valor de retorno (saída( saída). Os argumentos (ou parâmetros) indicam o tipo e quais valores são esperados pela função (entrada( entrada). int soma(int a, int b) { int c; c = a + b; return c; } Corpo da função

Funções :: Como declarar Uma função pode não ter argumentos, basta não informá-los. Exemplo: int random() { srand(time(null)); return (rand() % 100); }

Funções :: Como declarar return é A expressão contida no comando return chamado de valor de retorno da função. Esse comando é sempre o último a ser executado por uma função. Nada após ele será executado. As funções só podem ser declaradas fora de outras funções. Lembre-se que o corpo do programa principal (main()( main()) ) é uma função!

Funções :: Invocando Uma forma clássica de realizarmos a invocação (ou chamada) de uma função é atribuindo o seu valor a uma variável: resultado = soma(x,y); Na verdade, o resultado da chamada de uma função é uma expressão, que pode ser usada em qualquer lugar que aceite uma expressão: printf("soma: %d\n", soma(a,b) );

Funções :: Invocando Função que calcula a soma dos valores de x e y: int soma(int a, int b){ return (a + b); } int main(){ int x, y, resultado; x = 3; y = 5; resultado = soma(x, y); printf("%d\n", resultado); } 56

Funções :: Invocando As variáveis x e y no exemplo anterior são chamadas de parâmetros reais. Conforme exemplo anterior, os argumentos não possuem necessariamente os mesmos nomes que os parâmetros que a função espera. Seus valores são apenas copiados para a função chamada, sem ser afetados pelas alterações nos parâmetros dentro da função.

O tipo void É utilizado em procedimentos. É um tipo que representa o nada, ou seja: uma variável desse tipo armazena conteúdo indeterminado, uma função desse tipo NÃO retorna um conteúdo. Indica que uma função não retorna nenhum valor,, ou seja, é um procedimento.

Procedimentos :: Como declarar void nome_do_procedimento (<tipo> parâmetro1, <tipo> parâmetro2,..., <tipo> parâmetron) { <corpo do procedimento> }

Procedimentos :: Como declarar Exemplo de procedimento: void imprime_dobro(int x) { printf("dobro de x: %d", 2*x); }

Procedimentos :: Invocando Para invocarmos um procedimento, devemos utilizá-lo como qualquer outro comando: procedimento(parâmetros); Compare a diferença de invocação de uma função: resultado = função(parâmetros);

Procedimentos :: Invocando int x, y, resultado; void soma() { resultado = x + y; } int main() { x = 3; y = 5; soma(); printf("%d\n", resultado); } 58

Variáveis locais e globais Uma variável é chamada local quando é declarada dentro de uma função.. Nesse caso: Ela existe apenas dentro da função que a contém. Após o término da execução da função, ela deixa de existir. Uma variável é chamada global quando é declarada fora de qualquer função.. Nesse caso: Pode ser acessada em qualquer parte do programa. Ela existe durante toda a execução do programa. 60

Variáveis locais e globais Boa prática de programação: Deve-se evitar o uso de variáveis globais. As funções devem modificar apenas as suas variáveis locais e as variáveis passadas a elas como parâmetros.

Escopo de variáveis O escopo de uma variável determina de que partes do código ela pode ser acessada. A regra de escopo em C é bem simples: As variáveis globais são visíveis por todas as funções. As variáveis locais são visíveis apenas na função onde foram declaradas.

Escopo de variáveis É possível declarar variáveis locais com o mesmo nome de variáveis globais. Nesta situação, a variável local esconde a variável global. int nota; void funcao() { int nota; // Neste ponto, nota eh variavel local. } 61

A função main() É uma função especial invocada automaticamente pelo sistema operacional (OS) ao iniciar o programa. Quando utilizado, o comando return informa ao OS se o programa funcionou corretamente ou não. O padrão é que um programa retorne: = zero caso tenha funcionado corretamente, zero caso contrário.

Declaração de funções e procedimentos sem defini-los Funções e procedimentos podem ser definidos antes ou depois da função main(). Em ambos os casos, as funções e/ou procedimentos devem ser declarados antes da função main(). O conjunto de comandos que constituem uma função ou procedimento pode ser definido em qualquer lugar do programa.

Declaração de funções e procedimentos sem defini-los Para declarar uma função sem defini-la (especificar seu código), substituímos as chaves e seu conteúdo por ponto-e-vírgula. <tipo> nome (<tipo> parâmetro1, <tipo> parâmetro2,..., <tipo> parâmetron); 59

Variáveis automáticas estáticas Variáveis declaradas dentro de uma função (locais) têm existência apenas enquanto a função está sendo executada,, deixando de existir quando a função termina sua tarefa. O mecanismo responsável por essa dinâmica é chamado de pilha de execução: 1. A pilha de execução está vazia; 2. Ao iniciar a execução de um bloco {},, as variáveis são empilhadas à medida em que são criadas; 3. Ao final de um bloco {}, essas variáveis são desempilhadas,, liberando espaço na memória.

Variáveis automáticas estáticas Exemplo: Considere um procedimento que simplifica uma fração A fração é guardada em duas variáveis: par_num: guarda o numerador par_deno: guarda o denominador A fração é simplificada dividindo-se cada elemento pelo máximo divisor comum

Variáveis automáticas estáticas A B C D void simplifica(int par_num, int par_den) { int num, den; num = par_num; den = par_den; while (den!=0) { int resto; resto = num % den; num = den; den = resto; } par_num = par_num/num; par_den = par_num/num; }

Variáveis automáticas estáticas :: Situação da pilha de execução A Antes do laço while: B Dentro do laço while: resto num num den den C Após o laço while: D Depois do procedimento: num den

Variáveis automáticas estáticas As variáveis locais também são conhecidas como variáveis automáticas,, por serem criadas e destruídas sempre que a função for executada. Se houver uma atribuição de valor a uma variável dentro de uma função, ela será realizada todas as vezes em que essa função for chamada.

Variáveis automáticas estáticas Para que uma função não destrua uma variável local ao final da execução, é preciso declará-la como estática. Para uma variável estática, a atribuição de valor inicial acontece somente uma vez, quando a variável é criada. Ao contrário das variáveis globais, as variáveis estáticas só podem ser usadas dentro da função que as declara. 61a

Passagem de Parâmetros É o mecanismo de informar sobre quais valores o processamento definido na função deve ser realizado. Os parâmetros são passados para uma função de acordo com a sua posição. Os parâmetros formais de uma função se comportam como variáveis locais (criados na entrada e destruídos na saída) Existem duas categorias: Por valor Por referência

Passagem de Parâmetros :: Passagem por valor Os valores das variáveis externas (função chamadora) são copiados para as variáveis internas da função chamada. Alteração no valor das variáveis terá efeito local à função chamada. var var_interna 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 62

Passagem de Parâmetros :: Passagem por referência Os valores das variáveis externas não são passados para a função, mas sim os seus endereços. Ocorre alteração no valor das variáveis externas. Usamos os operadores: & - indica o endereço da variável * - indica o conteúdo do apontador 63

Passagem de Parâmetros :: Passagem por referência var 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011

Passagem de Parâmetros Uma desvantagem da passagem por valor é que, se um item de dados grande está sendo passado, copiar esses dados pode consumir um tempo de processamento considerável.

Questões

Const Para indicar que um parâmetro de função não deve ser alterado, pode-se utilizar o qualificador const. Seu uso não inibe a alteração do parâmetro. Porém, se existir no corpo da função uma alteração de um parâmetro declarado como constante, o compilador gerará uma mensagem de advertência. 66

Parâmetros da função principal :: argv, argc Argc (Número de argumentos recebidos) É um número inteiro Possui valor maior ou igual a 1 (um) Argv (Guarda os argumentos recebidos) É um vetor de ponteiros para strings O primeiro argumento, argv[0], é sempre o nome do programa int main(int argc, char **argv)

Parâmetros da função principal :: argv, argc Exemplo. Ao executar:./p66a arg1 arg2 arg3 arg4 argc = 5 p 6 6 a argv 0 1 2 3 4 a r g 1 a r g 2 a r g 3 a r g 4 66a

Funções :: Recursividade Um objeto é dito recursivo se pode ser definido em termos de si próprio. Para fazer iogurte, você precisa de leite e de um pouco de iogurte. Para entender recursividade, você primeiro tem de entender recursividade.

Funções :: Recursividade A recursão é uma forma interessante de resolver problemas, pois o divide em problemas menores de mesma natureza. Um processo recursivo consiste de duas partes: O caso base,, cuja solução é conhecida. Um método geral que reduz o problema a um ou mais problemas menores de mesma natureza.

Funções :: Recursividade Fatorial Cálculo do fatorial: fat(n) = 1, se n = 1 n * fat(n-1), se n > 1

Funções :: Recursividade Fatorial Função recursiva que calcula o fatorial de um número: int fat(int n) { if (n!= 1) return n * fat(n-1); else return 1; } 57

Funções :: Recursividade Desvantagens Certos algoritmos são mais eficientes quando feitos de maneira recursiva. Contudo, quando usada incorretamente,, a recursividade tende a consumir muita memória e ser lenta. Um parcela da memória é reservada cada vez que o computador faz chamada a uma função.

Funções :: Recursividade Série de Fibonacci Compare as duas implementações da série de Fibonacci, uma realizada de forma iterativa e outra de forma recursiva. F(n) = 1, se n = 1, 2 F(n-1) + F(n-2), se n > 2 57a

Funções :: Recursividade Torre de Hanói São dados n discos de diâmetro 1, 2, 3,..., n, n dispostos por ordem decrescente no primeiro poste. Pretende-se transferir todos os discos para o terceiro poste, utilizando o menor número de movimentos, de tal modo que as seguintes restrições sejam satisfeitas: 1. Apenas um disco pode ser movido de cada vez. 2. Apenas os discos do topo podem ser movidos. 3. Um disco não pode ser colocado sobre outro menor.

Funções :: Recursividade Torre de Hanói 57b

Macros Macros são definições que aceitam parâmetros (argumentos). Antes da compilação do programa C, o pré-processador substitui as macros por sua definição. A substituição só não é realizada dentro de strings.

Macros Macros podem ser utilizadas no lugar de funções simples. Não há verificação de tipo de dados para os argumentos de uma macro, pois macros são utilizadas simplesmente para substituição de texto. Uma macro sem argumentos é processada como uma constante simbólica.

Macros #define MAX 100 #define TITULO "maxi" #define MOSTRA(x) "Valor (MAXIMO = %d): ", x int main() { int maxi; printf(titulo); printf(mostra(max)); scanf("%d", &maxi); printf("valor lido de MAX = %d\n", maxi); } int main() { int maxi; printf("maxi"); printf("valor (MAXIMO = %d): ", 100); scanf("%d", &maxi); printf("valor lido de MAX = %d\n", maxi); }

Macros No exemplo anterior: // Constante numérica #define MAX 100 // Constante de caracteres #define TITULO "maxi" // Macro #define MOSTRA(x) "Valor (MAXIMO = %d): ", x

Macros Mais exemplos de macros: // Determina o maior entre dois números #define MAX(x) ( ((x) > (y))? (x) : (y) ) // Determina o menor entre dois números #define MIN(x) ( ((x) < (y))? (x) : (y) ) 67

Macros Para que tantos parênteses? Definições de macro devem utilizar parênteses para garantir que a definição esteja correta mesmo se os parâmetros forem substituídos por expressões. 68

Macros Não incluir ponto-e-vírgula na definição de constantes ou macros: #define SOMA (x,y) ((x) + (y)); printf( Resultado: %d, SOMA(3,5)); Após o pré-processamento: printf( Resultado: %d, ((3) + (5)););

Macros Não deixar espaço entre o nome da macro e as lista de argumentos: #define SOMA (x,y) ((x) + (y)) A definição acima será interpretada como uma constante cujo valor é: (x,y) ((x) + (y))

Macros Macros não são recursivas. Macros podem ser utilizadas para substituir nomes de funções conhecidas, apesar de não ser recomendado. 69

Questões

Passagem de Vetores Vetores têm um comportamento diferente quando usados como parâmetros ou valores de retorno de funções. O compilador interpreta o nome de um vetor como o endereço do primeiro elemento do vetor. Dessa forma, os vetores são sempre passados por referência,, sem usar uma notação especial.

Passagem de Vetores :: Exemplo <tipo> funcao(int vet[],...) {... } 64 64a

Passagem de Vetores Ao passar um vetor como parâmetro, se ele for alterado dentro da função, as alterações ocorrerão no próprio vetor e não em uma cópia. Ao retornar um vetor como valor de retorno, não é feita uma cópia deste vetor. Assim, o vetor retornado pode desaparecer,, se ele foi declarado no corpo da função. Ao passar um vetor como parâmetro, não é necessário fornecer o seu tamanho na declaração da função. Porém, é importante lembrar que o vetor tem um tamanho que deve ser considerado pela função durante a manipulação dos dados. 64b

Passagem de Vetores Quando o vetor é multidimensional, a possibilidade de não informar o tamanho na declaração da função se restringe apenas à primeira dimensão. void show_matriz(int mat[][10], int n_linhas) {... } 65