Aula 18: Funções em C

Documentos relacionados
Aula 17: Ponteiros e Alocação Dinâmica em C

Programação Estruturada

Ponteiros e Tabelas. K&R: Capítulo 5

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

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

Ponteiros. Baseado nos slides do Prof. Mauro.

prim = A ; prim = &A[0];

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

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.

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Funções em Linguagem C Parte II

Modularidade - Funções e Procedimentos

Estruturas de Dados. Profa. Juliana Pinheiro Campos

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.

Aula 25: Alocação Dinâmica

1 Exercícios com ponteiros

Alocação Dinâmica em C

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Aula 15: Vetores e Matrizes em C

Programação I Funções. Prof. Carlos Alberto

INF 1007 Programação II

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

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

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

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

ESTRUTURA DE DADOS (TCC )

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

11a. Aula Ponteiros e Vetores

1 Exercícios com ponteiros

Aula 16: Manipulação de Arquivos em C

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

Computação 2. Aula 7. Profª. Fabiany Ponteiros

3. Linguagem de Programação C

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

Ponteiros & tabelas (cont.) K&R: Capítulo 5

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Ponteiros e Alocação de Memória

INF 1007 Programação II

Programação: Vetores

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

Linguagem e Técnicas de Programação

Algoritmos e Programação

Linguagens de Programação I

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

Linguagem C ponteiros

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

Modularidade - Fun ções e Procedimentos

Linguagem de Programação I. Aula 08 Linguagem C: Arrays

Linguagem C. André Tavares da Silva.

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

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

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

Aula 08: Funções (Parte II)

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

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

Faculdade de Computação

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

12 - Dados Estruturados Vetores, Matrizes e Strings

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

ED1 - Aula 01 Introducao e revisão

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Computação eletrônica: Funções

3. Linguagem de Programação C

Linguagem C: Introdução

Introdução à Programação

MC-102 Aula 14. Instituto de Computação Unicamp. 29 de Setembro de 2016

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

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

Algoritmos e Estruturas de Dados I (DCC/003) Funções

Introdução a Programação de Jogos

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Material sobre Funções AEDS 1

Conhecendo a Linguagem de Programação C

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Alocação Dinâmica de Memória. Programação II

Módulo 7 Cadeias de Caracteres

Objetivo. Compreender a definição e dominar a implementação de ponteiros em C. Dominar a manipulação de arquivos

Introdução à Programação

TAD: Tipo Abstrato de Dados (parte 2)

ponteiros INF Programação I Prof. Roberto Azevedo

Adriano Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Aula 27: Estruturas heterogêneas e alocação dinâmica

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

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

Subprogramas. Prof. Carlos Lopes

Programação de Computadores I Funções na Linguagem C PROFESSORA CINTIA CAETANO

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Transcrição:

Aula 18: Funções em C Fernanda Passos Universidade Federal Fluminense Programação de Computadores IV Fernanda Passos (UFF) Funções em C Programação de Computadores IV 1 / 38

Agenda 1 Revisão e Contexto 2 Módulos 3 Funções 4 Vetores/Matrizes como Parâmetros 5 Parâmetros do Programa Fernanda Passos (UFF) Funções em C Programação de Computadores IV 2 / 38

Agenda 1 Revisão e Contexto 2 Módulos 3 Funções 4 Vetores/Matrizes como Parâmetros 5 Parâmetros do Programa Fernanda Passos (UFF) Funções em C Programação de Computadores IV 3 / 38

Aula Anterior: Ponteiros: Vimos como ponteiro está relacionado a memória. Ponteiro é uma variável que guarda endereço de outra variável. Ele serve para referenciar uma outra variável. Operações com ponteiros: operadores (* e &), atribuição e aritméticas de ponteiros. Alocação dinâmica: Podemos alocar dinamicamente memória. Funções vistas: malloc() e free(). Usamos ponteiro para referenciar a área alocada. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 4 / 38

Foco da Aula de Hoje Funções: Rever conceitos de funções e procedimentos em algoritmos. Conhecer como eles são implementados em C. Estudar a passagem de parâmetros em C. Por valor e referência. Retorno de valor em funções. Parâmetros do programa: pela função main. Objetivos: Aprender como usar funções: declaração e chamada. Como passar diversos tipos de parâmetros. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 5 / 38

Agenda 1 Revisão e Contexto 2 Módulos 3 Funções 4 Vetores/Matrizes como Parâmetros 5 Parâmetros do Programa Fernanda Passos (UFF) Funções em C Programação de Computadores IV 6 / 38

Módulos Ao estudarmos algoritmo, vimos noções de módulos: Funções: retornam um valor. Procedimentos: sem retorno. Módulos recebem parâmetros e a passagem pode ser: por valor: cópia do valor do parâmetro e por referência: referência ao parâmetro. Na passagem por valor, as alterações nos parâmetros sofridas dentro do módulo não causam efeito fora dele. Na passagem por referência, as alterações nos parâmetros permanecem nas variáveis passadas após processamento do módulo. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 7 / 38

Agenda 1 Revisão e Contexto 2 Módulos 3 Funções 4 Vetores/Matrizes como Parâmetros 5 Parâmetros do Programa Fernanda Passos (UFF) Funções em C Programação de Computadores IV 8 / 38

Funções em C declarações globais Em aulas anteriores, vimos que um programa em C é formado por uma ou mais funções. Função principal (requerida): main. Pode possuir mais N funções. As funções devem ser escritas uma após a outra. Não existe a escrita de funções dentro de outras. tipo retorno f1(lista de parâmetros){ sequência de comandos } tipo retorno f2(lista de parâmetros){ sequência de comandos }. tipo retorno fn(lista de parâmetros){ sequência de comandos } tipo retorno main(lista de parâmetros){ sequência de comandos } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 9 / 38

Implementação de Funções em C Forma geral da escrita de uma função: tipo retorno nome da função(lista de parâmetros) { corpo da função } tipo retorno: é o tipo de retorno da função. nome da função: é um identificador para a função. lista de parâmetros: lista de parâmetros da função composta pelo tipo e nome de variáveis separados por vírgula. A lista pode conter quantos parâmetros forem necessários e pode ser vazia também. Exemplo: int f1(char a, int n, float f){ // corpo da funcao } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 10 / 38

Implementação de Funções em C (II) No corpo da função, podemos inserir código que ela irá executa quando for chamada. Uma função só é executada se for chamada direta ou indiretamente na função main. No corpo, podemos fazer declaração de variáveis. Convenciona-se realizá-la no início. Mas é possível declarar variáveis em qualquer lugar do código em C. Todas as variáveis declaradas dentro da função são locais. Isto quer dizer que só valem dentro da função. Quando a função termina, elas deixam de existir: memória é desalocada automaticamente. Se houver tipo a ser retornado, deve-se usar o comando return. Este comando faz com que o programa saia da função e retorne para a função que o chamou. O valor retornado deve condizer com o valor indicado na declaração da função. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 11 / 38

Implementação de Funções em C: Exemplo 1 Função que realiza a potência de número real através de multiplicações sucessivas. Ela retorna o valor de n e para e 0. 1 float potencia(float n, int e){ 2 int i; 3 float resultado = 1; 4 5 for(i=0; i<e; i++){ 6 resultado = resultado * n; 7 } 8 return(resultado); 9 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 12 / 38

Procedimentos em C Procedimentos não são puramente suportados em C. Para produzi-lo, deve-se especificar um tipo de retorno void para uma função. Dentro da função, o retorno pode ser feito através de um return vazio. Ou simplesmente não usá-lo, se o retorno é no fim da função. Exemplo: 1 void imprimetabuadan(int n){ 2 int i; 3 4 for(i=1; i<=10; i++){ 5 printf(" %2d x %2d = %3d\n", n, i, n*i); 6 } 7 return; // Esta linha pode ser removida. 8 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 13 / 38

Chamada de Funções A chamada de uma função pode ser realizada dentro de qualquer função. Podemos, inclusive, ter uma hierarquia de chamadas. Isto é, chamar uma função dentro de outra em vários níveis. Toda vez que uma função é chamada, um novo escopo é criado para ela. Escopo é a região de memória definida no bloco da função. Portanto, a cada chamada da função, um novo bloco é alocado com novas variáveis locais. Mas para ser executada, deve-se começar a chamada pelo main. Pois o main é a função iniciada quando o programa começa a executar. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 14 / 38

Chamada de Funções: Exemplo 2 Chamando a função potencia(): 1 #include <stdio.h> 2 3 float potencia(float n, int e){ 4 int i; 5 float resultado = 1; 6 7 for(i=0; i<e; i++){ 8 resultado = resultado * n; 9 } 10 return(resultado); 11 } 12 13 int main(int argc, char * argv[]){ 14 15 printf("%.2fˆ%d = %.2f\n", 3.0, 4, potencia(3.0, 4)); 16 printf("%.2fˆ%d = %.2f\n", 2.5, 2, potencia(2.5, 2)); 17 return(0); 18 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 15 / 38

Passagem Parâmetros Em C, toda passagem de parâmetro é por valor. Os parâmetros são variáveis locais que identificam os argumentos das funções. Assim sendo, é realizada uma cópia do valor passado para a função nas variáveis declaradas na função. Produz o efeito desejado da passagem por valor. Isto é, não alterar o parâmetro passado. Na chamada de uma função, qualquer expressão pode ser passada. Expressões podem ser quaisquer combinações de: constantes, expressões numéricas ou lógicas, variáveis, funções. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 16 / 38

Passagem Parâmetros: Exemplo 3 Exemplo de passagens de parâmetros diversas: 1 #include <stdio.h> 2 3 int f1(int a, int b){ 4 return(a+2*b); 5 } 6 void f2(int a, int b, int c){ 7 printf("a: %d, b: %d e c: %d\n", a, b, c); 8 } 9 10 int main(int argc, char *argv[]){ 11 int val1, val2; 12 13 printf("digite um inteiro: "); 14 scanf("%d", &val1); 15 val2 = f1(val1, 10); 16 f2(val1, val2-val1, f1(5, val1)); 17 return(0); 18 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 17 / 38

Passagem Parâmetros: Exemplo 3 Se entrada for o número 0, saída será: Digite um inteiro: 0 a: 0, b: 20 e c: 5 Se entrada for o número 2, saída será: Digite um inteiro: 2 a: 2, b: 20 e c: 9 Se entrada for o número -1, saída será: Digite um inteiro: -1 a: -1, b: 20 e c: 3 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 18 / 38

Passagem Parâmetros: Tipos dos Valores Os valores passados para uma função devem casar com os tipos dos parâmetros declarados na função. Caso contrário, serão convertidos ou truncados. Pode causar resultado inesperado, se não respeitado. 1 #include <stdio.h> 2 3 int f1(int a, int b){ 4 return(a+2*b); 5 } 6 int main(int argc, char *argv[]){ 7 int val; 8 9 val = f1(1, 7.0/2.0); 10 // Se b fosse float, resultado seria 8 (1+2*3.5) 11 // Como b é int, resultado é 7 (1 + 2*3). 12 printf("val: %d\n", val); 13 return(0); 14 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 19 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) f3(f4(a), b); int f4(int a) Suponha o seguinte esboço de código: return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); Fernanda Passos (UFF) Funções em C Programação de Computadores IV 20 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) f3(f4(a), b); Execução: int f4(int a) return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); Execução: void f2(int a, int b) f3(f4(a), b); int f4(int a) return(a*2); void f1(int a) f2(a+1, a-1); a = 2 void f3(int a, int b) printf("%d %d\n", a, b); Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) f3(f4(a), b); int f4(int a) return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); void f1(int a) f2(a+1, a-1); Execução: a = 2 void f2(int a, int b) a = 3, b = 1 f3(f4(a), b); Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) f3(f4(a), b); int f4(int a) return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); void f1(int a) f2(a+1, a-1); Execução: a = 2 void f2(int a, int b) a = 3, b = 1 f3(f4(a), b); int f4(int a) return(a*2); a = 3 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) Execução: f3(f4(a), b); int f4(int a) void f1(int a) f2(a+1, a-1); a = 2 return(a*2); void f3(int a, int b) void f2(int a, int b) a = 3, b = 1 f3(f4(a), b); 6 printf("%d %d\n", a, b); Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) Execução: f3(f4(a), b); int f4(int a) void f1(int a) f2(a+1, a-1); a = 2 return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); void f2(int a, int b) a = 3, b = 1 f3(f4(a), b); 6 void f3(int a, int b) a = 6, b = 1 printf("%d %d\n", a, b); Saída: 6 1 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) Execução: f3(f4(a), b); int f4(int a) void f1(int a) f2(a+1, a-1); a = 2 return(a*2); void f3(int a, int b) void f2(int a, int b) a = 3, b = 1 f3(f4(a), b); 6 printf("%d %d\n", a, b); Saída: 6 1 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) Execução: f3(f4(a), b); int f4(int a) return(a*2); void f1(int a) f2(a+1, a-1); a = 2 void f3(int a, int b) printf("%d %d\n", a, b); Saída: 6 1 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) Execução: f3(f4(a), b); int f4(int a) return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); Saída: 6 1 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) f3(f4(a), b); int f4(int a) Execução: void f2(int a, int b) a = 3, b = 2 f3(f4(a), b); return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); Saída: 6 1 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) f3(f4(a), b); int f4(int a) Execução: void f2(int a, int b) a = 3, b = 2 f3(f4(a), b); return(a*2); int f4(int a) a = 3 void f3(int a, int b) return(a*2); printf("%d %d\n", a, b); Saída: 6 1 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) f3(f4(a), b); int f4(int a) return(a*2); void f3(int a, int b) Execução: void f2(int a, int b) a = 3, b = 2 f3(f4(a), b); 6 void f3(int a, int b) a = 6, b = 2 printf("%d %d\n", a, b); printf("%d %d\n", a, b); Saída: 6 1 6 2 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) f3(f4(a), b); int f4(int a) Execução: void f2(int a, int b) a = 3, b = 2 f3(f4(a), b); return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); Saída: 6 1 6 2 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Entendendo Chamadas de Funções Hierárquicas void f1(int a) f2(a+1, a-1); void f2(int a, int b) Execução: f3(f4(a), b); int f4(int a) return(a*2); void f3(int a, int b) printf("%d %d\n", a, b); Saída: 6 1 6 2 Fernanda Passos (UFF) Funções em C Programação de Computadores IV 21 / 38

Passagem de Parâmetros por Referência A linguagem C permite simular a passagem de parâmetro por referência. Permite estipular outra forma de saída de dados da função. Isto é feito através de ponteiros. Na verdade, o valor de uma variável ponteiro é passada para a função. Ainda é passagem por valor: passa-se o valor endereço. Mas através dele, podemos referenciar uma outra variável. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 22 / 38

Passagem de Parâmetros por Referência: Exemplo 4 Trocar o valor de duas variáveis. 1 #include <stdio.h> 2 3 void troca(int *x, int *y){ 4 int temp; 5 6 temp = *x; // Salva o valor que está em x 7 *x = *y; // põe o valor de y em x 8 *y = temp; // põe o valor de temp (x) em y 9 } 10 int main(int argc, char * argv[]){ 11 int a = 0, b = 1; 12 13 // Deve-se passar o endereço das variáveis. 14 printf("a: %d e b: %d\n", a, b); 15 troca(&a, &b); 16 printf("a: %d e b: %d\n", a, b); 17 return(0); 18 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 23 / 38

Passagem de Parâmetros por Referência: Exemplo 5 Retornando resultado de uma função em um parâmetro: 1 #include <stdio.h> 2 3 void potencia(float *r, float n, int e){ 4 int i; 5 float resultado = 1; 6 7 for(i=0; i<e; i++) 8 resultado = resultado * n; 9 *r = resultado; 10 } 11 int main(int argc, char * argv[]){ 12 float res; 13 14 potencia(&res, 3.0, 4); 15 printf("%.2fˆ%d = %.2f\n", 3.0, 4, res); 16 return(0); 17 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 24 / 38

Agenda 1 Revisão e Contexto 2 Módulos 3 Funções 4 Vetores/Matrizes como Parâmetros 5 Parâmetros do Programa Fernanda Passos (UFF) Funções em C Programação de Computadores IV 25 / 38

Vetores/Matrizes como Parâmetros Podemos passar vetores e matrizes como parâmetro para funções. Quando passamos um vetor ou matriz como parâmetro, o ponteiro é o valor copiado para a função. Deste modo, o vetor não é copiado. Modificar um vetor dentro de uma função altera o valor fora. Existem duas maneiras de declarar vetores/matrizes de acordo como elas foram declaradas: ou estaticamente, ou dinamicamente. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 26 / 38

Declarar Vetores Estáticos como Parâmetros Existem 3 formas similares de se declarar uma função com vetor como parâmetro. com colchetes e tamanho definido: void mostravetor(int vet[10]){ int i; for(i=0; i<10; i++) printf("%d ", vet[i]); printf("\n"); } com colchetes vazio: void mostravetor(int vet[]){ int i; for(i=0; i<10; i++) printf("%d ", vet[i]); printf("\n"); } como ponteiro (asterisco): void mostravetor(int *vet){ int i; for(i=0; i<10; i++) printf("%d ", vet[i]); printf("\n"); } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 27 / 38

Declarar Matrizes Estáticas como Parâmetros Para matriz, existem 2 maneiras similares: com colchetes e dimensões definidas: void mostramatriz(int mat[5][5]){ int i, j; for(i=0; i<5; i++){ for(j=0; j<5; j++) printf("%d ", mat[i][j]); printf("\n"); } com primeiro colchetes vazio e segundo com dimensão definida: void mostramatriz(int mat[][5]){ int i, j; for(i=0; i<5; i++){ for(j=0; j<5; j++) printf("%d ", mat[i][j]); printf("\n"); } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 28 / 38

Passando Vetor como Parâmetro: Exemplo 6 Função que imprime um vetor. 1 #include <stdio.h> 2 3 void mostravetor(int vet[]){ 4 int i; 5 6 for(i=0; i<5; i++){ 7 printf("%d ", vet[i]); 8 } 9 printf("\n"); 10 } 11 int main(int argc, char * argv[]){ 12 int A[5], B[5], i; 13 14 for(i=0; i<5; i++){ 15 A[i] = i; 16 B[i] = 4 - i; 17 } 18 printf("vetor A:\n"); 19 mostravetor(a); 20 printf("vetor B:\n"); 21 mostravetor(b); 22 return(0); 23 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 29 / 38

Passando Matriz como Parâmetro: Exemplo 7 Função que imprime uma matriz. 1 #include <stdio.h> 2 3 void mostramatriz(int mat[][5]){ 4 int i, j; 5 6 for(i=0; i<5; i++){ 7 for(j=0; j<5; j++) 8 printf("%4d ", mat[i][j]); 9 printf("\n"); 10 } 11 } 12 int main(int argc, char * argv[]){ 13 int A[5][5], B[5][5], i, j; 14 15 for(i=0; i<5; i++) 16 for(j=0; j<5; j++){ 17 A[i][j] = i*5 + j; 18 B[i][j] = 2*(i*5 + j); 19 } 20 21 printf("matriz A:\n"); 22 mostramatriz(a); 23 printf("matriz B:\n"); 24 mostramatriz(b); 25 26 return(0); 27 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 30 / 38

Modificando Parâmetro Vetor: Exemplo 8 Exemplo em que modificamos o valor de um vetor (leitura de vetor de arquivo). 1 #include <stdio.h> 2 3 int levetor(char * nomearq, int vet[], int *tam_vet){ 4 FILE * arq; 5 int i = 0, valor; 6 7 arq = fopen(nomearq, "r"); 8 if(arq == NULL){ 9 printf("arquivo nao pode ser aberto\n"); 10 return(1); // Nao conseguiu ler. 11 } 12 while (fscanf(arq, "%d", &valor) > 0){ 13 vet[i] = valor; i++; 14 } 15 fclose(arq); 16 *tam_vet = i; 17 return(0); // Conseguiu ler. 18 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 31 / 38

Vetor como Parâmetro: Exemplo 8 (cont.) 19 void mostravetor(int vet[], int tam){ 20 int i; 21 22 printf("vetor de tamanho %d:", tam); 23 for(i=0; i<tam; i++){ 24 printf(" %d", vet[i]); 25 } 26 printf("\n"); 27 } 28 29 int main(int argc, char * argv[]){ 30 int A[100], tama; // Vetor tem, no maximo, tamanho 100. 31 32 if(levetor("vetor.txt", A, &tama) == 0){ 33 mostravetor(a, tama); 34 } 35 return(0); 36 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 32 / 38

Agenda 1 Revisão e Contexto 2 Módulos 3 Funções 4 Vetores/Matrizes como Parâmetros 5 Parâmetros do Programa Fernanda Passos (UFF) Funções em C Programação de Computadores IV 33 / 38

Parâmetros do Programa Algumas vezes é útil passar informação para um programa quando o executamos. Por exemplo, o nosso compilador gcc: gcc é um programa: o compilador que transforma código fonte em executável. Quando chamamos ele, passamos alguns argumentos para ele: gcc codigo.c -o executavel codigo.c, -o e executavel são parâmetros do programa gcc. Podemos passar, via console, argumentos para nosso programa também. Isto é feito através dos argumentos especiais argc e argv. São parâmetros para a função main. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 34 / 38

argc e argv argc: é um inteiro que indica quantos argumentos tem o programa. Inclui o próprio nome do programa. Os argumentos são separados por espaço. argv: é um vetor de strings. Cada palavra é uma string. O argv[0] é o nome do programa. A partir da posição 1, temos os argumentos. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 35 / 38

argc e argv: Exemplo 9 Imprimir Ola e o seu nome, passando ele como argumento do programa. Para rodar:./ola Maria 1 #include <stdio.h> 2 3 int main(int argc, char *argv[]){ 4 5 if(argc < 2){ 6 printf("modo de uso:\n\t%s <seu nome>\n", argv[0]); 7 return(1); 8 } 9 printf("ola %s!\n", argv[1]); 10 return(0); 11 } Fernanda Passos (UFF) Funções em C Programação de Computadores IV 36 / 38

Conversão de String para Valor Numérico O argv é um vetor de strings. Portanto, só podemos passar string para o programa. E se quisermos passar um valor numérico? Fernanda Passos (UFF) Funções em C Programação de Computadores IV 37 / 38

Conversão de String para Valor Numérico O argv é um vetor de strings. Portanto, só podemos passar string para o programa. E se quisermos passar um valor numérico? Para isso, existem funções de conversão de string para int, float, e outros. Na stdlib.h, temos: atoi: converte string para int. atol: converte string para long. atof : converte string para double. Na stdio.h, temos: sprintf: converte de acordo com o formato. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 37 / 38

Exercícios Escreva um programa que receba por parâmetro (pelo console) o nome de dois arquivos. O primeiro é um arquivo que contém um vetor de inteiros. O segundo é um arquivo de saída. O programa deve: ler o arquivo com o vetor, calcular a média dos valores e escrever o resultado de cada valor dividido pela média no arquivo de saída. Fernanda Passos (UFF) Funções em C Programação de Computadores IV 38 / 38