Sie sind auf Seite 1von 95

Curso de C

Procedimentos e Funes

01/04/09 09:42

Curso C - IC/UNICAMP

Funes
Roteiro: Funes
Declarao e chamada

Funes importantes Exemplos de funes Variveis


Globais, locais e parmetros
01/04/09 09:42 2

>

Curso C - IC/UNICAMP

Funes
Funes: So trechos de cdigo fora do programa principal Implementam um subalgoritmo do programa So utilizadas (chamadas) em diversos pontos do programa

01/04/09 09:42

>

Curso C - IC/UNICAMP

Funes
Vantagens:
Organiza o cdigo:
Cada funo um algoritmo Dividir um programa complicado em vrias funes simples

Evita repetio de cdigo semelhante


Escrever o cdigo apenas uma vez Usar a mesma funo vrias vezes para variveis diferentes

Simplifica e agiliza a programao


01/04/09 09:42 4

>

Curso C - IC/UNICAMP

Funes
Exemplo: comparar a mdia das duas melhores
notas do aluno A e do aluno B

Algoritmo:
Ler 3 notas dos alunos A e B Calcular a mdia de A Calcular a mdia de B Comparar as mdias Imprimir resultados
01/04/09 09:42 5

>

Curso C - IC/UNICAMP

Funes
Alguns problemas no exemplo ... Ler 3 notas dos alunos A e B Calcular a mdia de A Calcular a mdia de B Comparar as mdias Imprimir resultados

01/04/09 09:42

>

Curso C - IC/UNICAMP

Funes
Alguns problemas no exemplo ... Ler 3 notas dos alunos A e B Calcular a mdia de A Repetio do Repetio do mesmo algoritmo mesmo algoritmo Calcular a mdia de B Comparar as mdias Imprimir resultados

01/04/09 09:42

>

Curso C - IC/UNICAMP

Funes
Alguns problemas no exemplo ... Ler 3 notas dos alunos A e B Calcular a mdia de A Repetio do Repetio do mesmo algoritmo mesmo algoritmo Calcular a mdia de B Comparar as mdias Imprimir resultados
Soluo: Uma funo genrica para calcular a mdia Soluo: Uma funo genrica para calcular a mdia
01/04/09 09:42 8

>

Curso C - IC/UNICAMP

Funes
Alguns problemas no exemplo ...
Ler 3 notas dos alunos A e B Calcular a mdia de A Calcular a mdia de B Comparar as mdias Imprimir resultados
Funcoes\ ota01\ ota01.vcproj

01/04/09 09:42

>

Curso C - IC/UNICAMP

Funes
Alguns problemas no exemplo ...
Ler 3 notas dos alunos A e B Calcular a mdia de A Calcular a mdia de B Comparar as mdias Imprimir resultados
Programa principal Programa principal mistura vrios mistura vrios algoritmos: algoritmos:
Leitura Leitura Clculo de mdia Clculo de mdia Comparao Comparao Impresso Impresso

Funcoes\ ota01\ ota01.vcproj

01/04/09 09:42

10

>

Curso C - IC/UNICAMP

Funes
Alguns problemas no exemplo ...
Ler 3 notas dos alunos A e B Calcular a mdia de A Calcular a mdia de B Comparar as mdias Imprimir resultados
Programa principal Programa principal mistura vrios mistura vrios algoritmos: algoritmos:
Leitura Leitura Clculo de mdia Clculo de mdia Comparao Comparao Impresso Impresso

Funcoes\ ota01\ ota01.vcproj

Soluo: Uma funo para cada algoritmo Soluo: Uma funo para cada algoritmo
01/04/09 09:42 11

>

Curso C - IC/UNICAMP

Funes
Chamada de funo:
1. Interrupo do programa principal 2. Passagem de dados de entrada para a funo 3. Execuo do cdigo da funo 4. Retorno do resultado 5. Continuao do programa principal
01/04/09 09:42 Programa principal Instrues C

12

>

Curso C - IC/UNICAMP

Funes
Chamada de funo:
1. Interrupo do programa principal 2. Passagem de dados de entrada para a funo 3. Execuo do cdigo da funo 4. Retorno do resultado 5. Continuao do programa principal
01/04/09 09:42 Programa principal Instrues C

chamada

13

>

Curso C - IC/UNICAMP

Funes
Chamada de funo:
1. Interrupo do programa principal 2. Passagem de dados de entrada para a funo 3. Execuo do cdigo da funo 4. Retorno do resultado 5. Continuao do programa principal
01/04/09 09:42 Programa principal Dados de entrada Instrues C Funo chamada

14

>

Curso C - IC/UNICAMP

Funes
Chamada de funo:
1. Interrupo do programa principal 2. Passagem de dados de entrada para a funo 3. Execuo do cdigo da funo 4. Retorno do resultado 5. Continuao do programa principal
01/04/09 09:42 Programa principal Dados de entrada Instrues C Funo chamada Resultado

15

>

Curso C - IC/UNICAMP

Funes
Chamada de funo:
1. Interrupo do programa principal 2. Passagem de dados de entrada para a funo 3. Execuo do cdigo da funo 4. Retorno do resultado 5. Continuao do programa principal
01/04/09 09:42 Programa principal Dados de entrada Instrues C Funo chamada Resultado

Instrues C

16

>

Curso C - IC/UNICAMP

Funes
Chamada de funo: Para chamar uma funo: Para chamar uma funo:
sentena(s); sentena(s); ... ... resultado = nome(entr11, entr22, ...); resultado = nome(entr , entr , ...);

... ... sentena(s); sentena(s);


01/04/09 09:42 17

>

Curso C - IC/UNICAMP

Funes
Chamada de funo: Para chamar uma funo: Para chamar uma funo:
sentena(s); sentena(s); ... ... resultado = nome(entr11, entr22, ...); resultado = nome(entr , entr , ...);

... ... sentena(s); sentena(s);


01/04/09 09:42

Nome da funo

18

>

Curso C - IC/UNICAMP

Funes
Chamada de funo: Para chamar uma funo: Para chamar uma funo:
sentena(s); sentena(s); Valores de entrada ... (parmetros) ... resultado = nome(entr11, entr22, ...); resultado = nome(entr , entr , ...);

... ... sentena(s); sentena(s);


01/04/09 09:42

Nome da funo

19

>

Curso C - IC/UNICAMP

Funes
Chamada de funo: Para chamar uma funo: Para chamar uma funo:
sentena(s); sentena(s); Valores de entrada ... (parmetros) ... resultado = nome(entr11, entr22, ...); resultado = nome(entr , entr , ...); Resultado ... ... sentena(s); sentena(s);
01/04/09 09:42

Nome da funo

20

>

Curso C - IC/UNICAMP

Exemplo: Calcular distncia entre dois pontos


#include <stdio.h> #include <stdio.h> #include <math.h> #include <math.h> int main(int argc, char *argv[]) { int main(int argc, char *argv[]) { double x1, x2, y1, y2, d; double x1, x2, y1, y2, d; scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); printf("Distncia: %lf", d); printf("Distncia: %lf", d); return 0; return 0; } }
01/04/09 09:42

Funcoes\Chamada01\Chamada01.vcproj
21

>

Curso C - IC/UNICAMP

Exemplo: Calcular distncia entre dois pontos


#include <stdio.h> #include <stdio.h> #include <math.h> #include <math.h> int main(int argc, char *argv[]) { int main(int argc, char *argv[]) { double x1, x2, y1, y2, d; double x1, x2, y1, y2, d; scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); printf("Distncia: %lf", d); printf("Distncia: %lf", d); return 0; return 0; } }
01/04/09 09:42

Funo

Valores de entrada (parmetros)


Funcoes\Chamada01\Chamada01.vcproj
22

>

Curso C - IC/UNICAMP

Exemplo: Calcular distncia entre dois pontos


#include <stdio.h> #include <stdio.h> Interrompe o #include <math.h> #include <math.h> programa para int main(int argc, char *argv[]) { int main(int argc, char *argv[]) { executar sqrt double x1, x2, y1, y2, d; double x1, x2, y1, y2, d; scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); printf("Distncia: %lf", d); printf("Distncia: %lf", d); return 0; return 0; } }
01/04/09 09:42

Funo

Valores de entrada (parmetros)


Funcoes\Chamada01\Chamada01.vcproj
23

>

Curso C - IC/UNICAMP

Exemplo: Calcular distncia entre dois pontos


#include <stdio.h> #include <stdio.h> Interrompe o #include <math.h> #include <math.h> programa para int main(int argc, char *argv[]) { int main(int argc, char *argv[]) { executar sqrt double x1, x2, y1, y2, d; double x1, x2, y1, y2, d; scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); printf("Distncia: %lf", d); printf("Distncia: %lf", d); return 0; return 0; } }
01/04/09 09:42

Funo Resultado

Valores de entrada (parmetros)


Funcoes\Chamada01\Chamada01.vcproj
24

>

Curso C - IC/UNICAMP

Exemplo: Calcular distncia entre dois pontos


#include <stdio.h> #include <stdio.h> Interrompe o #include <math.h> #include <math.h> programa para int main(int argc, char *argv[]) { int main(int argc, char *argv[]) { executar sqrt double x1, x2, y1, y2, d; double x1, x2, y1, y2, d; scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); scanf("%lf, %lf, %lf, %lf", &x1, &y1, &x2, &y2); Depois d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); continua aqui printf("Distncia: %lf", d); printf("Distncia: %lf", d); return 0; return 0; } }
01/04/09 09:42

Funo Resultado

Valores de entrada (parmetros)


Funcoes\Chamada01\Chamada01.vcproj
25

>

Curso C - IC/UNICAMP

Funes
Definio de funes:
tipo nome(parmetros) { tipo nome(parmetros) { declaraes de variveis declaraes de variveis ... ... instrues; instrues; ... ... return valor; return valor; } }
01/04/09 09:42 26

>

Curso C - IC/UNICAMP

Funes
Nome: Identifica o trecho de cdigo da funo O nome usado na chamada Formao igual a nome de varivel
tipo nome(parmetros) { tipo nome(parmetros) { declaraes declaraes instrues; instrues; return valor; return valor; } } 27
>

Nome da funo
01/04/09 09:42

Curso C - IC/UNICAMP

Funes
Nome:
Nome da funo: media

... media(...) { ... media(...) { Declaraes Declaraes Instrues Instrues ... ... } } Corpo da funo
tipo nome(parmetros) { tipo nome(parmetros) { declaraes declaraes instrues; instrues; return valor; return valor; } } 28
>

01/04/09 09:42

Curso C - IC/UNICAMP

Funes
Parmetros:
Definir dados de entrada. So variveis locais, declaradas e atribudas na chamada da funo. Programa principal Lista de tipos e nomes. Dados de entrada
Instrues C Funo

tipo nome(parmetros) { tipo nome(parmetros) { declaraes declaraes instrues; instrues; return valor; return valor; } } 01/04/09 09:42

chamada Resultado

Instrues C
29

>

Curso C - IC/UNICAMP

Funes
Parmetros:
Lista de 3 parmetros: Variveis locais da funo: float nota1, nota2 e nota3 ... media(float nota1, float nota2, ... media(float nota1, float nota2, float nota3) { float nota3) { Declaraes Declaraes tipo nome(parmetros) { tipo nome(parmetros) { Instrues Instrues declaraes declaraes ... ... instrues; instrues; } return valor; } return valor;
01/04/09 09:42

} }

30

>

Curso C - IC/UNICAMP

Funes
Parmetros na chamada de funo: Ao chamar a funo, o valor de cada parmetro deve ser informado Regras:
Um valor para cada parmetro Valores compatveis com o tipo do parmetro Valores na mesma ordem que na declarao
Chamada de funo: Chamada de funo: nome(parametro1, parametro2, ...) nome(parametro1, parametro2, ...)
01/04/09 09:42 31

>

Curso C - IC/UNICAMP

Funes
Parmetros na chamada de funo:
float resultado; float resultado; resultado = potencia(2.0f, 5.0f); resultado = potencia(2.0f, 5.0f); Quando a funo executa
Declarao da funo potencia:

... potencia(float base, float expoente) { ... potencia(float base, float expoente) { ... ... // Corpo da funo // Corpo da funo ... ... } } 01/04/09 09:42 32
>

Curso C - IC/UNICAMP

Funes
Parmetros na chamada de funo:
float resultado; float resultado; resultado = potencia(2.0f, 5.0f); resultado = potencia(2.0f, 5.0f); Quando a funo executa base = 2.0f

Declarao da funo potencia:

... potencia(float base, float expoente) { ... potencia(float base, float expoente) { ... ... // Corpo da funo // Corpo da funo ... ... } } 01/04/09 09:42 33
>

Curso C - IC/UNICAMP

Funes
Parmetros na chamada de funo:
float resultado; float resultado; resultado = potencia(2.0f, 5.0f); resultado = potencia(2.0f, 5.0f); Quando a funo executa base = 2.0f expoente = 5.0f

Declarao da funo potencia:

... potencia(float base, float expoente) { ... potencia(float base, float expoente) { ... ... // Corpo da funo // Corpo da funo ... ... } } 01/04/09 09:42 34
>

Curso C - IC/UNICAMP

Funes
Parmetros na chamada de funo: Tipos: int, long int, char, float, etc So variveis locais declaradas no corpo da funo e que vo ser inicializadas com cpias dos valores correspondentes s expresses na chamada da funo!
... maior_elemento(char c, int tamanho) { ... maior_elemento(char c, int tamanho) { // Corpo da funo // Corpo da funo } }
01/04/09 09:42 35

>

Curso C - IC/UNICAMP

Funes
Funo sem parmetros:
Lista vazia de parmetros ...funcaoSemParametros(void) ...funcaoSemParametros(void) { { Declaraes Declaraes Instrues tipo nome(void) { Instrues tipo nome(void) { ... declaraes ... declaraes instrues; } instrues; } de funo: Chamada de funo: Chamada
funcaoSemParametros() funcaoSemParametros()
01/04/09 09:42

return valor; return valor;


36

} }
>

Curso C - IC/UNICAMP

Funes
Corpo da funo: Cdigo para o algoritmo da funo. Declara variveis locais, alm dos parmetros. Parmetros so variveis locais, j prdeclaradas.

01/04/09 09:42

tipo nome(parmetros) { tipo nome(parmetros) { declaraes declaraes instrues; instrues; return valor; return valor; } } 37
>

Curso C - IC/UNICAMP

Funes
Corpo da funo:
... media(float nota1, float nota2, float nota3) { ... media(float nota1, float nota2, float nota3) { float media; float media; if ((nota1 <= nota2) && (nota1 <= nota3)) { if ((nota1 <= nota2) && (nota1 <= nota3)) { media = (nota2 + nota3) / 2.0f; media = (nota2 + nota3) / 2.0f; } else if ((nota2 <= nota1) && (nota2 <= nota3)) { } else if ((nota2 <= nota1) && (nota2 <= nota3)) { media = (nota1 + nota3) / 2.0f; media = (nota1 + nota3) / 2.0f; } else { } else { media = (nota1 + nota2) / 2.0f; media = (nota1 + nota2) / 2.0f; } } ... ... } }
01/04/09 09:42 38

>

Curso C - IC/UNICAMP

Funes
Valor de retorno: Tipo da funo:
Indica o domnio do resultado da funo Qualquer tipo vlido para variveis
Programa principal Dados de entrada

tipo nome(parmetros) { tipo nome(parmetros) { declaraes declaraes Tipo da instrues; instrues; funo return valor; return valor; } }
01/04/09 09:42

Instrues C Funo chamada Resultado

Instrues C

39

>

Curso C - IC/UNICAMP

Funes
Valor de retorno:
Comando return Termina a execuo da funo. Define o resultado (valor de retorno). Deve ser compatvel com o tipo da funo.
Programa principal

tipo nome(parmetros) { tipo nome(parmetros) { declaraes declaraes instrues; Valor do instrues; return valor; return valor; resultado } }
01/04/09 09:42

Dados de entrada Instrues C Funo chamada Resultado

Instrues C

40

>

Curso C - IC/UNICAMP

Funes
Valor de retorno:
float mediaMelhoresNotas(float nota1, float nota2, float mediaMelhoresNotas(float nota1, float nota2, float nota3) { float nota3) { float media; float media; if ((nota1 <= nota2) && (nota1 <= nota3)) { if ((nota1 <= nota2) && (nota1 <= nota3)) { media = (nota2 + nota3) / 2.0f; media = (nota2 + nota3) / 2.0f; } else if ((nota2 <= nota1) && (nota1 <= nota3)){ } else if ((nota2 <= nota1) && (nota1 <= nota3)){ media = (nota1 + nota3) / 2.0f; media = (nota1 + nota3) / 2.0f; } else { } else { media = (nota1 + nota2) / 2.0f; media = (nota1 + nota2) / 2.0f; } } return media; return media; } }
01/04/09 09:42 41

>

Curso C - IC/UNICAMP

Funes
Funo sem valor de retorno:
void comparaNotas(float mediaA, float mediaB) { void comparaNotas(float mediaA, float mediaB) { if (mediaA > mediaB) { if (mediaA > mediaB) { printf("Aluno A"); printf("Aluno A"); } else if (mediaA < mediaB) { } else if (mediaA < mediaB) { printf("Aluno B"); printf("Aluno B"); } else { } else { printf(Alunos A e B"); printf(Alunos A e B"); } } return; return; } }

Tipo de retorno: void


Esta funo no retorna resultado.
01/04/09 09:42 42

>

Curso C - IC/UNICAMP

Funes
Exemplo completo: programa principal
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) { float notaA1, notaA2, notaA3, mediaA; float notaA1, notaA2, notaA3, mediaA; float notaB1, notaB2, notaB3, mediaB; float notaB1, notaB2, notaB3, mediaB; scanf("%f %f %f", &notaA1, &notaA2, &notaA3); scanf("%f %f %f", &notaA1, &notaA2, &notaA3); scanf("%f %f %f", &notaB1, &notaB2, &notaB3); scanf("%f %f %f", &notaB1, &notaB2, &notaB3); mediaA = mediaMelhoresNotas(notaA1, notaA2, notaA3); mediaA = mediaMelhoresNotas(notaA1, notaA2, notaA3); mediaB = mediaMelhoresNotas(notaB1, notaB2, notaB3); mediaB = mediaMelhoresNotas(notaB1, notaB2, notaB3); comparaNotas(mediaA, mediaB); comparaNotas(mediaA, mediaB); return 0; return 0; } }
01/04/09 09:42

Funcoes\ ota02\ ota02.vcproj


43

>

Funes

Funes importantes

01/04/09 09:42

44

Curso C - IC/UNICAMP

Funes importantes
Funo main: Contm o programa principal Vrias declaraes possveis:
void main(void) { ... } int main() { ... } int main(int argc, char *argv[])

01/04/09 09:42

45

>

Curso C - IC/UNICAMP

Funes importantes
Leitura e Escrita:
Ler dados do usurio e escrever na tela #include <stdlib.h> Vrias funes disponveis:
scanf, printf, getchar, putchar, gets, puts, ...

Exemplo:
prinft("Resultado: %d", valor); scanf("%d %d", &linhas, &colunas);

01/04/09 09:42

46

>

Curso C - IC/UNICAMP

Funes importantes
Manipulao de arquivos:
Ler e escrever dados em arquivos ou fluxos de dados. #include <stdio.h> Vrias funes disponveis:
fopen, fclose, fscanf, fprintf, rewind, fflush, fputc, fputs, fgetc, fgets, ftell, fseek, etc...
01/04/09 09:42 47

>

Curso C - IC/UNICAMP

Funes importantes
Matemticas:
Realizar operaes matemticas. #include <math.h> Vrias funes disponveis:
sqrt,sqr, pow, exp, log, log10 sin, asen, senh, cos, acos, cosh, tan, atan, atan2, tanh floor, ceil, abs

01/04/09 09:42

48

>

Curso C - IC/UNICAMP

Funes importantes
Texto e caracteres:
Modificar texto (vetores de caracteres). #include <string.h> Vrias funes disponveis:
strcat, strdup, strlen, strcmp, strcpy, strstr

01/04/09 09:42

49

>

Funes

Exemplos de Funes

01/04/09 09:42

50

Curso C - IC/UNICAMP

Exemplos de Funes
Matemtica:
float potencia(float base, int expoente) { float resultado = 1.0; int i; for (i = 0; i < expoente; i++) { resultado = resultado * base; } return resultado; }
Funcoes\Potencia01\Potencia01.vcproj Funcoes\Potencia02\Potencia02.vcproj
01/04/09 09:42 51

>

Curso C - IC/UNICAMP

Exemplos de Funes
Exemplo: Leitura de dados
int le_numero(int min, int max) { int leitura; scanf("%d", &leitura); while ((leitura < min) || (leitura > max)) { printf(Digite entre %1d e %1d)\n", min, max); printf("Digite novamente: "); scanf("%d", &leitura); } return leitura; }
Funcoes\Entrada01\Entrada01.vcproj
01/04/09 09:42 52

>

Curso C - IC/UNICAMP

Exemplos de Funes
Funo para medir tempo:
#include <time.h> int main(int argc, char argv[]) { int fim, inicio = clock(); int i; for (i = 0; i < 20000; i++) { printf("Um texto para imprimir... %d\n", i); } fim = clock(); printf("Tempo necessrio: %d\n", fim - inicio); return 0; }
01/04/09 09:42 Funcoes\Time01\Time01.vcproj 53

>

Curso C - IC/UNICAMP

Exemplos de Funes
Organizao de cdigo:
Ruim:
char opcao; scanf(%c, &opcao); if (opcao == P) { // Cdigo para calcular raizes de polinmios // ... } else if (opcao == M) {
// Cdigo para calcular determinantes de matrizes

// ... } else if (opcao == D) { // Cdigo para calcular derivadas de funes // ... }


01/04/09 09:42 54

>

Curso C - IC/UNICAMP

Exemplos de Funes
Organizao de cdigo:
void resolver_polinimio(void) { // Cdigo ... } void calcular_determinante(void) { // Cdigo ... } void derivar_funcao(void) { // Cdigo ... scanf(%c, &opcao); } if (opcao == P) { resolver_polinomio(); } else if (opcao == M) { calcular_determinante(); } else if (opcao == D) { derivar_funcao(); } 01/04/09 09:42 55 }

>

Funes

Tempo de vida de variveis

01/04/09 09:42

56

Curso C - IC/UNICAMP

Variveis
Tempo de vida: Tempo que o valor da varivel permanece na memria:
do incio at final do programa, ou da chamada at final da funo

01/04/09 09:42

57

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
Variveis declaradas localmente em uma funo:
Tempo de vida: durante a execuo da funo Durante a execuo a varivel visvel, acessvel Durante a execuo est associada posies de memria Em duas execues, ocupam posies de memria diferentes

{ int v = 0; ... }
01/04/09 09:42 58

Vida da varivel v

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida: Declarao dentro do corpo da funo
Visibilidade apenas na funo
int funcao(void) { int v = 0; ... } int main(void) { ... a(); }
01/04/09 09:42 59

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida: Declarao dentro do corpo da funo
Visibilidade apenas na funo
int funcao(void) { int v = 0; ... } int main(void) { ... a(); }
01/04/09 09:42 60

Visibilidade da varivel v

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida: Declarao dentro do corpo da funo
Visibilidade apenas na funo
int funcao(void) { int v = 0; ... } int main(void) { ... a(); }
01/04/09 09:42

Visibilidade da varivel v

Aqui a varivel v invisvel


61

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
Variveis declaradas fora do corpo das funes
Sobrevivem por toda a execuo do programa Permanecem ocupando a mesma posio de memria int v = 0; int funcao(void) { ... } int main(void) { ... a(); } 01/04/09 09:42

Vida da varivel v

62

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
int x = 0; int a(void) { int v = 0; ... } int b(void) { int w = 0; ... } int main(void) { ... }
01/04/09 09:42 63

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
int x = 0; int a(void) { int v = 0; ... } int b(void) { int w = 0; ... } int main(void) { ... }
01/04/09 09:42

Vida da varivel v Vida da varivel w

64

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
int x = 0; int a(void) { int v = 0; ... } int b(void) { int w = 0; ... } int main(void) { ... }
01/04/09 09:42

Vida da varivel v Vida da varivel w Vida da varivel x

65

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
int v = 0; int funcaoA(void) { int w = 0; ... } int funcaoB(void) { ... } int main(void) { ... } 01/04/09 09:42

66

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
int v = 0; int funcaoA(void) { int w = 0; ... } int funcaoB(void) { ... } int main(void) { ... } 01/04/09 09:42

w inacessvel

67

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
int v = 0; int funcaoA(void) { int w = 0; ... } int funcaoB(void) { ... } int main(void) { ... } 01/04/09 09:42

w inacessvel w acessvel

68

>

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
int v = 0; int funcaoA(void) { int w = 0; ... } int funcaoB(void) { ... } int main(void) { ... } 01/04/09 09:42

w inacessvel w acessvel

w inacessvel
69

Curso C - IC/UNICAMP

Variveis
Tempo de vida:
int v = 0; int funcaoA(void) { int w = 0; ... } int funcaoB(void) { ... } int main(void) { ... } 01/04/09 09:42

w inacessvel w acessvel v sempre acessvel w inacessvel


70

>

Curso C - IC/UNICAMP

Variveis
Sobreposio de nomes: Condies:
Variveis com mesmo nome Sobreposio de escopo

Conseqncia:
Declarao mais recente torna inacessvel outras declaraes

01/04/09 09:42

71

>

Curso C - IC/UNICAMP

Variveis
Sobreposio de nomes:
int w = 0; int funcao (void) { int w = 1; ... } int main(void) { ... }
01/04/09 09:42 72

Curso C - IC/UNICAMP

Variveis
Sobreposio de nomes:
int w = 0; int funcao (void) { int w = 1; ... } int main(void) { ... }
01/04/09 09:42 73

w acessvel

Curso C - IC/UNICAMP

Variveis
Sobreposio de nomes:
int w = 0; int funcao (void) { int w = 1; ... } int main(void) { ... }
01/04/09 09:42 74

w acessvel w acessvel, mas sobrepe w anterior

>

Curso C - IC/UNICAMP

Variveis
Sobreposio de nomes:
int w = 0; int funcao (void) { int w = 1; ... } int main(void) { ... }
01/04/09 09:42

w acessvel w acessvel, mas sobrepe w anterior w anterior novamente acessvel


75

>

Curso C - IC/UNICAMP

Variveis
Varivel global:
Declarada fora das funes Tempo vida:
at fim do programa acessvel a todas funes do programa, exceto quando h sobreposio
int v = 0; void f1(void) { ... } void f2(void) { ... }
76

Inicializao:
ao iniciar o programa
01/04/09 09:42

>

Curso C - IC/UNICAMP

Variveis
Varivel global:
int v = 0; void f1(void) { v++; printf("f1: v = %d\n", v); } void f2(void) { v+=2; printf("f2: v = %d\n", v); } int main(int argc, char argv[]) { f1(); f2(); f1(); } 01/04/09 09:42

Resultado: Resultado: f1: v = f1: v = f2: v = f2: v = f1: v = f1: v =

Funcoes\Visibilidade01\Visibilidade01.vcproj

77

>

Curso C - IC/UNICAMP

Variveis
Varivel global:
int v = 0; void f1(void) { v++; printf("f1: v = %d\n", v); } void f2(void) { v+=2; printf("f2: v = %d\n", v); } int main(int argc, char argv[]) { f1(); f2(); f1(); } 01/04/09 09:42

Resultado: Resultado: f1: v = 1 f1: v = 1 f2: v = 3 f2: v = 3 f1: v = 4 f1: v = 4

Funcoes\Visibilidade01\Visibilidade01.vcproj

78

>

Curso C - IC/UNICAMP

Variveis
Varivel local: Declarada dentro das funes Tempo vida:
do incio at o fim da funo nova execuo no lembra valor anterior

Inicializao:
no incio da funo
01/04/09 09:42

void f1(void) int v = ... } void f2(void) int w = ... }

{ 0;

{ 0;

79

>

Curso C - IC/UNICAMP

Variveis
Varivel local:
void f1() { int v = 0; v++; printf("f1: v = %d\n", v); } void f2() { int v = 0; v+=2; printf("f2: v = %d\n", v); } int main(int argc, char argv[]) { f1(); f2(); f1(); 01/04/09 09:42 Funcoes\Visibilidade02\Visibilidade02.vcproj }

Resultado: Resultado: f1: v = f1: v = f2: v = f2: v = f1: v = f1: v =

80

>

Curso C - IC/UNICAMP

Variveis
Varivel local:
void f1() { int v = 0; v++; printf("f1: v = %d\n", v); } void f2() { int v = 0; v+=2; printf("f2: v = %d\n", v); } int main(int argc, char argv[]) { f1(); f2(); f1(); 01/04/09 09:42 Funcoes\Visibilidade02\Visibilidade02.vcproj }

Resultado: Resultado: f1: v = 1 f1: v = 1 f2: v = 2 f2: v = 2 f1: v = 1 f1: v = 1

81

>

Funes

Arquivos de cabealhos Compilao em separado

01/04/09 09:42

82

Curso C - IC/UNICAMP

Arquivos Cabealho
Arquivos cabealho (headers ou .h):
A diretiva #include
Permite incluir arquivos no ponto de chamada Texto do arquivo substitui a diretiva, no ponto de chamada Nome do arquivo entre < > Sistema operacional sabe onde encontrar o arquivo

.... #include <stdio.h> #include <math.h> ....


01/04/09 09:42 83

>

Curso C - IC/UNICAMP

Arquivos Cabealho
Seus prprios arquivos cabealho:
Nomes com extenso .h Nomes devem aparecer entre aspas duplas () Indicar diretrio onde esto os arquivos
Default depende do sistema operacional

Contm: definies de constantes comuns, etc. . . .... #include ....


01/04/09 09:42

consts.h

Funcoes\PegaPal\PegaPal.vcproj 84

>

Curso C - IC/UNICAMP

Arquivos Cabealho
Seus prprios arquivos cabealho:
Nomes com extenso .h Nomes devem aparecer entre aspas duplas () Indicar diretrio onde esto os arquivos
Default depende do sistema operacional

Contm: definies de constantes comuns, etc. . . .... #include ....


01/04/09 09:42

/* arquivo .h com definio de constantes */ consts.h #define pi 3.141592 #define true 1 . . . .


Funcoes\PegaPal\PegaPal.vcproj 85

>

Curso C - IC/UNICAMP

Arquivos Cabealho
Seus prprios arquivos cabealho:
Nomes com extenso .h Nomes devem aparecer entre aspas duplas () Indicar diretrio onde esto os arquivos
Default depende do sistema operacional
Arquivo const.h

Contm: definies de constantes comuns, etc. . . .... #include ....


01/04/09 09:42

/* arquivo .h com definio de constantes */ consts.h #define pi 3.141592 #define true 1 . . . .


Funcoes\PegaPal\PegaPal.vcproj 86

>

Curso C - IC/UNICAMP

Pragmas
Onde escrever o cdigo de funes:
At agora:
.... int funcaoA(int a) { ... } float funcaoB(char c, double r) { ... } char funcaoC(char c, int x) { ... } // Int main( ... ) { ... }
01/04/09 09:42 87

>

Curso C - IC/UNICAMP

Pragmas
Onde escrever o cdigo de funes:
At agora:
.... int funcaoA(int a) { ... } float funcaoB(char c, double r) { ... } char funcaoC(char c, int x) { ... } // Int main( ... ) { ... }
01/04/09 09:42

funcaoA conhecida aqui

88

>

Curso C - IC/UNICAMP

Pragmas
Onde escrever o cdigo de funes:
At agora:
.... int funcaoA(int a) { ... } float funcaoB(char c, double r) { funcaoA conhecida aqui ... } char funcaoC(char c, int x) { funcaoA, funcaoB conhecidas aqui ... } // Int main( ... ) { ... }
01/04/09 09:42 89

>

Curso C - IC/UNICAMP

Pragmas
Onde escrever o cdigo de funes:
At agora:
.... int funcaoA(int a) { ... } float funcaoB(char c, double r) { funcaoA conhecida aqui ... } char funcaoC(char c, int x) { funcaoA, funcaoB conhecidas aqui ... } // Int main( ... ) { funcaoA, funcaoB, funcaoC conhecidas aqui ... }
01/04/09 09:42 90

>

Curso C - IC/UNICAMP

Pragmas
Cdigo das funes no final: pragmas
.... int funcaoA(int a); float funcaoB(char c, double r); char funcaoC(char c, int x); // Int main( ... ) { ...} // int funcaoA(int a) { ... } float funcaoB(char c, double r) { ... } char funcaoC(char c, int x) { ... }
01/04/09 09:42

Funcoes\MDC\MDDC.vcproj 91

>

Curso C - IC/UNICAMP

Pragmas
Cdigo das funes no final: pragmas
.... int funcaoA(int a); float funcaoB(char c, double r); char funcaoC(char c, int x); // Int main( ... ) { ...} // int funcaoA(int a) { ... } float funcaoB(char c, double r) { ... } char funcaoC(char c, int x) { ... }
01/04/09 09:42

pragmas de funes

Funcoes\MDC\MDDC.vcproj 92

>

Curso C - IC/UNICAMP

Pragmas
Cdigo das funes no final: pragmas
.... int funcaoA(int a); pragmas de funes float funcaoB(char c, double r); char funcaoC(char c, int x); // Int main( ... ) { funcaoA, funcaoB, funcaoC conhecidas aqui ...} // int funcaoA(int a) { ... } float funcaoB(char c, double r) { ... } char funcaoC(char c, int x) { ... }
01/04/09 09:42

Funcoes\MDC\MDDC.vcproj 93

>

Curso C - IC/UNICAMP

Pragmas
Cdigo das funes no final: pragmas
.... int funcaoA(int a); pragmas de funes float funcaoB(char c, double r); char funcaoC(char c, int x); // Int main( ... ) { funcaoA, funcaoB, funcaoC conhecidas aqui ...} // int funcaoA(int a) { ... } float funcaoB(char c, double r) { Corpo das funes ... } char funcaoC(char c, int x) { ... }
01/04/09 09:42

Funcoes\MDC\MDDC.vcproj 94

>

Funes

Fim do captulo

01/04/09 09:42

95