[email protected] DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria...

54
[email protected] DSC/CCT/UFCG Profs .: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel Carga Horária: 60 h

Transcript of [email protected] DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria...

Page 1: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

ran

gel@

dsc.u

fpb

.br

DSC/CCT/UFCGDSC/CCT/UFCG

Profs.:Profs.: José Eustáquio Rangel de QueirozRoberto Medeiros de FariaUlrich Schiel

José Eustáquio Rangel de QueirozRoberto Medeiros de FariaUlrich Schiel

Carga Horária:Carga Horária: 60 h60 h

Page 2: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

22

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Tópicos

5.1 Introdução5.2 Módulos de Programas em C5.3 Biblioteca de Funções Matemáticas 5.4 Funções 5.5 Definições de Função 5.6 Protótipos de Funções 5.7 Arquivos de Cabeçalho5.8 Chamada de Funções por Valor e por Referência5.9 Geração de Números Aleatórios 5.10 Exemplo: Jogo de Azar

Tópicos

5.1 Introdução5.2 Módulos de Programas em C5.3 Biblioteca de Funções Matemáticas 5.4 Funções 5.5 Definições de Função 5.6 Protótipos de Funções 5.7 Arquivos de Cabeçalho5.8 Chamada de Funções por Valor e por Referência5.9 Geração de Números Aleatórios 5.10 Exemplo: Jogo de Azar

Introdução à ProgramaçãoIntrodução à Programação

Page 3: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

33

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Tópicos

5.11 Classes de Armazenamento 5.12 Regras de Escopo 5.13 Recursividade5.14 Exemplo de Recursividade: Série de Fibonacci 5.15 Recursividade vs. Iteração

Tópicos

5.11 Classes de Armazenamento 5.12 Regras de Escopo 5.13 Recursividade5.14 Exemplo de Recursividade: Série de Fibonacci 5.15 Recursividade vs. Iteração

Introdução à ProgramaçãoIntrodução à Programação

Page 4: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

44

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Divisão para a conquista

Construção de programas a partir de partes ou componentes menores

Módulos

Maior facilidade de gestão de cada módulo do que do programa original

Componentes do programa que se repetem em pontos distintos

Divisão para a conquista

Construção de programas a partir de partes ou componentes menores

Módulos

Maior facilidade de gestão de cada módulo do que do programa original

Componentes do programa que se repetem em pontos distintos

5.1 Introdução5.1 Introdução

Page 5: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

55

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Funções Módulos em C Possibilidade de combinação de funções

definidas pelo usuário com funções das bibliotecas nos programas

Existência de uma vasta gama de funções na biblioteca padrão de C

Funções Módulos em C Possibilidade de combinação de funções

definidas pelo usuário com funções das bibliotecas nos programas

Existência de uma vasta gama de funções na biblioteca padrão de C

5.2 Módulos de Programas em C

5.2 Módulos de Programas em C

Page 6: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

66

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Chamadas de Funções Invocação de funções

Explicitação do nome da função e passagem de argumentos (dados)

Realização de operações ou manipulações pela função

Retorno dos resultados pela função

Chamadas de Funções Invocação de funções

Explicitação do nome da função e passagem de argumentos (dados)

Realização de operações ou manipulações pela função

Retorno dos resultados pela função

5.2 Módulos de Programas em C

5.2 Módulos de Programas em C

Page 7: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

77

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Chamadas de Funções Analogia

Solicitação de execução de uma tarefa pelo patrão a um empregado

Aquisição de informações sobre a tarefa pelo empregado

Execução da tarefa

Retorno dos resultados

Ocultação da informação (patrão não conhece os detalhes)

Chamadas de Funções Analogia

Solicitação de execução de uma tarefa pelo patrão a um empregado

Aquisição de informações sobre a tarefa pelo empregado

Execução da tarefa

Retorno dos resultados

Ocultação da informação (patrão não conhece os detalhes)

5.2 Módulos de Programas em C

5.2 Módulos de Programas em C

Page 8: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

88

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Biblioteca de Funções Matemáticas Execução de cálculos matemáticos comuns

#include <math.h>

Formato para a chamada de funções Nome_da_Função(argumento1, …, argumentoN);

Uso da vígula como separador em listas múltiplas de argumentos

Biblioteca de Funções Matemáticas Execução de cálculos matemáticos comuns

#include <math.h>

Formato para a chamada de funções Nome_da_Função(argumento1, …, argumentoN);

Uso da vígula como separador em listas múltiplas de argumentos

5.3 Biblioteca de Funções Matemáticas

5.3 Biblioteca de Funções Matemáticas

Page 9: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

99

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Formato para a chamada de funções

printf( "%.2f", sqrt( 900.0 ) );

Chamada da função sqrt, a qual retorna a raiz quadrada de seu argumento

Todas as funções matemáticas retornam dados do tipo double

Argumentos Constantes, variáveis ou expressões

Formato para a chamada de funções

printf( "%.2f", sqrt( 900.0 ) );

Chamada da função sqrt, a qual retorna a raiz quadrada de seu argumento

Todas as funções matemáticas retornam dados do tipo double

Argumentos Constantes, variáveis ou expressões

5.3 Biblioteca de Funções Matemáticas

5.3 Biblioteca de Funções Matemáticas

Page 10: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1010

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.4 Funções5.4 Funções

Funções

Modularização de um programa

Todas as variáveis declaradas dentro de funções são variáveis locais

Conhecidas apenas no contexto da função

Parâmetros

Informação da comunicação entre funções

Variáveis locais

Funções

Modularização de um programa

Todas as variáveis declaradas dentro de funções são variáveis locais

Conhecidas apenas no contexto da função

Parâmetros

Informação da comunicação entre funções

Variáveis locais

Page 11: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1111

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.4 Funções5.4 Funções

Benefícios de funções

Divisão para conquista

Desenvolvimento gerenciável de programas

Reusabilidade de Software

Uso de funções existentes como blocos para a construção de novos programas

Abstração

Ocultação de detalhes internos (funções da biblioteca)

Repetição de código evitada

Benefícios de funções

Divisão para conquista

Desenvolvimento gerenciável de programas

Reusabilidade de Software

Uso de funções existentes como blocos para a construção de novos programas

Abstração

Ocultação de detalhes internos (funções da biblioteca)

Repetição de código evitada

Page 12: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1212

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.5 Definições de Funções

5.5 Definições de Funções

Formato de Definição de uma Função

Tipo_do_valor_de_retorno nome_da_função (lista de Tipo_do_valor_de_retorno nome_da_função (lista de

parâmetros )parâmetros ){{

declarações e atribuições declarações e atribuições}}

Nome_da_funçãoNome_da_função Qualquer identificador válido

Formato de Definição de uma Função

Tipo_do_valor_de_retorno nome_da_função (lista de Tipo_do_valor_de_retorno nome_da_função (lista de

parâmetros )parâmetros ){{

declarações e atribuições declarações e atribuições}}

Nome_da_funçãoNome_da_função Qualquer identificador válido

Page 13: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1313

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.5 Definições de Funções

5.5 Definições de Funções

Formato de Definição de uma Função

Lista_de_ParâmetrosLista_de_Parâmetros Declaração de uma série de parametros

Um tipo deve ser listado explicitamente para cada parâmetro, caso contrário o parâmetro será considerado do tipo int

Formato de Definição de uma Função

Lista_de_ParâmetrosLista_de_Parâmetros Declaração de uma série de parametros

Um tipo deve ser listado explicitamente para cada parâmetro, caso contrário o parâmetro será considerado do tipo int

Page 14: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1414

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Formato de Definição de uma Função

Tipo_do_valor_de_retorno nome_da_função (lista de Tipo_do_valor_de_retorno nome_da_função (lista de parâmetros )parâmetros )

{{ declarações e atribuições declarações e atribuições

}}

Declarações e atribuições Corpo da função (bloco de código)

Variáveis podem ser declaradas dentro dos blocos (podem ser aninhadas)

Funções não podem ser definidas dentro de outras funções

Formato de Definição de uma Função

Tipo_do_valor_de_retorno nome_da_função (lista de Tipo_do_valor_de_retorno nome_da_função (lista de parâmetros )parâmetros )

{{ declarações e atribuições declarações e atribuições

}}

Declarações e atribuições Corpo da função (bloco de código)

Variáveis podem ser declaradas dentro dos blocos (podem ser aninhadas)

Funções não podem ser definidas dentro de outras funções

5.5 Definições de Funções

5.5 Definições de Funções

Page 15: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1515

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Formato de Definição de uma Função Retorno do Controle

Quando não há retorno

return;

Se algo for retornado

return expression;

Formato de Definição de uma Função Retorno do Controle

Quando não há retorno

return;

Se algo for retornado

return expression;

5.5 Definições de Funções

5.5 Definições de Funções

Page 16: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1616

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.5 Definições de Funções

5.5 Definições de Funções

02 #include <stdio.h>0304 int maximo( int, int, int ); /* protótipo da função */05 int main()06 {07 int a, b, c;0809 printf( “Digite três inteiros: " );10 scanf( "%d%d%d", &a, &b, &c );11 printf( “O maximo eh: %d\n", maximo( a, b, c ) );1213 return 0;14 }

01 /* Determinação do máximo de três inteiros */

Função Principal (Programa Principal) Função Principal (Programa Principal)

Page 17: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1717

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Função Máximo Função Máximo

5.5 Definições de Funções

5.5 Definições de Funções

15 /* Definição da função maximo */16 int maximo( int x, int y, int z )17 {18 int max = x;1920 if ( y > max )21 max = y;2223 if ( z > max )24 max = z;2526 return max;27 }

Digite três inteiros: 22 85 17Digite três inteiros: 22 85 17Maximo eh: 85Maximo eh: 85 Digite três inteiros: 22 85 17Digite três inteiros: 22 85 17Maximo eh: 85Maximo eh: 85

Page 18: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1818

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.5 Definições de Funções

5.5 Definições de Funções

/* Este programa lê nome e notas de alunos e determina a média da turma e o melhor aluno */#include <stdio.h>#include <string.h>#include <conio.h>void lerdados();char nome[20]="";float nota;

int main(){ char melhor_aluno[20]=""; int contador; float media, melhor_nota, soma;/* INICIALIZACAO */ soma = 0; contador = 0; lerdados(); /* chamada da função *//* PROCESSAMENTO */ melhor_nota = nota; strcpy(melhor_aluno, nome); while (nota != -1) {soma = soma+nota; contador = contador + 1; lerdados(); /* chamada da função */ if (nota > melhor_nota) {melhor_nota = nota; strcpy(melhor_aluno, nome); } }

/* Este programa lê nome e notas de alunos e determina a média da turma e o melhor aluno */#include <stdio.h>#include <string.h>#include <conio.h>void lerdados();char nome[20]="";float nota;

int main(){ char melhor_aluno[20]=""; int contador; float media, melhor_nota, soma;/* INICIALIZACAO */ soma = 0; contador = 0; lerdados(); /* chamada da função *//* PROCESSAMENTO */ melhor_nota = nota; strcpy(melhor_aluno, nome); while (nota != -1) {soma = soma+nota; contador = contador + 1; lerdados(); /* chamada da função */ if (nota > melhor_nota) {melhor_nota = nota; strcpy(melhor_aluno, nome); } }

/* FINALIZACAO */ if (contador != 0) {media = soma / contador; printf("\nA media da turma e: %.2f\n", media); printf("O melhor aluno eh: %s", melhor_aluno); printf(" com a nota %.2f", melhor_nota); } else printf("\nNenhum aluno digitado."); getch(); return 0;}void lerdados(){ printf("Digite o nome do proximo aluno: "); scanf("%s", &nome); printf("\nDigite a nota deste aluno: "); scanf("%f", &nota); return;}

Page 19: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

1919

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.6 Protótipos de Funções

5.6 Protótipos de Funções

Protótipo de uma Função Nome da função Parâmetros O QUE a função recebe Tipo de Retorno Tipo de dado que a função

retorna (default int) Uso no processo de validação de funções Necessidade de inclusão do protótipo apenas se a

definição da função sucede a função principal Função com o protótipo

int maximo(int, int, int);

Recebimento de 3 parâmetros int Retorno de 1 dado int

Protótipo de uma Função Nome da função Parâmetros O QUE a função recebe Tipo de Retorno Tipo de dado que a função

retorna (default int) Uso no processo de validação de funções Necessidade de inclusão do protótipo apenas se a

definição da função sucede a função principal Função com o protótipo

int maximo(int, int, int);

Recebimento de 3 parâmetros int Retorno de 1 dado int

Page 20: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2020

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.6 Protótipos de Funções

5.6 Protótipos de Funções

Coerção de Argumentos Imposição de argumentos do tipo apropriado Exemplo

Função sqrt Possibilidade de chamada com um argumento int, embora o protótipo em math.h especifique um argumento double

printf(“%.3f\n”, sqrt(4));printf(“%.3f\n”, sqrt(4)); Resultado gerado Cálculo correto de sqrt(4) sqrt(4) e

impressão do valor 2.000

Coerção de Argumentos Imposição de argumentos do tipo apropriado Exemplo

Função sqrt Possibilidade de chamada com um argumento int, embora o protótipo em math.h especifique um argumento double

printf(“%.3f\n”, sqrt(4));printf(“%.3f\n”, sqrt(4)); Resultado gerado Cálculo correto de sqrt(4) sqrt(4) e

impressão do valor 2.000

Page 21: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2121

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.6 Protótipos de Funções

5.6 Protótipos de Funções

Regras de Promoção Especificação de como alguns tipos podem ser

convertidos para outros sem perda de dados

Possibilidade de cometimento de erros Conversão de double em int Truncamento da

parte fracionária do valor double

Aplicação automática a expressões contendo dois ou mais tipos de dados (mistas)

Regras de Promoção Especificação de como alguns tipos podem ser

convertidos para outros sem perda de dados

Possibilidade de cometimento de erros Conversão de double em int Truncamento da

parte fracionária do valor double

Aplicação automática a expressões contendo dois ou mais tipos de dados (mistas)

Page 22: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2222

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.7 Arquivos de Cabeçalho

5.7 Arquivos de Cabeçalho

Arquivos de Cabeçalho

Contêm os protótipos das funções das bibliotecas referenciadas no programa

E.g. <stdlib.h> , <math.h> , <conio.h>

Necessidade de inclusão da(s) linha(s)

#include <nome_do_arquivo>

#include <math.h>

Arquivos de Cabeçalho

Contêm os protótipos das funções das bibliotecas referenciadas no programa

E.g. <stdlib.h> , <math.h> , <conio.h>

Necessidade de inclusão da(s) linha(s)

#include <nome_do_arquivo>

#include <math.h>

Page 23: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2323

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.7 Arquivos-Cabeçalhos

5.7 Arquivos-Cabeçalhos

Arquivos-Cabeçalhos Customizados

Criação de arquivos com funções

Salvamento

<nome_do_arquivo.h>

Inclusão em outros arquivos

#include “nome_do_arquivo.h”

Reuso das funções

Arquivos-Cabeçalhos Customizados

Criação de arquivos com funções

Salvamento

<nome_do_arquivo.h>

Inclusão em outros arquivos

#include “nome_do_arquivo.h”

Reuso das funções

Page 24: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2424

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.7 Arquivos-Cabeçalhos5.7 Arquivos-Cabeçalhosvoid formapal(int n){ char letra[1], palavra[20]; int cont;

/* inicializa‡ao */ strcpy(palavra,"");

/* Processamento */ for(cont=1;cont<=n;cont++) { printf("Digite uma letra minusculas: "); scanf("%s", &letra); strcat(palavra, letra); }/* Finaliza‡ao */ printf("\nA palavra e:** %s**\n ",

palavra);return;}

void formapal(int n){ char letra[1], palavra[20]; int cont;

/* inicializa‡ao */ strcpy(palavra,"");

/* Processamento */ for(cont=1;cont<=n;cont++) { printf("Digite uma letra minusculas: "); scanf("%s", &letra); strcat(palavra, letra); }/* Finaliza‡ao */ printf("\nA palavra e:** %s**\n ",

palavra);return;}

/* Programa que forma várias palavras de tamanho variável a partir de letras digitadas */#include <stdio.h>#include <string.h>#include "formapal.h"main(){ int tamanho;/* inicializa‡ao */

printf("\nDigite o tamanho da primeira palavra \n"); scanf("%d", &tamanho);

/* Processamento */ do { formapal(tamanho); printf("\nDigite o tamanho da proxima palavra \n"); scanf("%d", &tamanho); } while (tamanho!=0);

/* Finaliza‡ao */return 0;}

Page 25: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2525

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.8 Chamada de Funções por Valor e por Referência

5.8 Chamada de Funções por Valor e por Referência

Uso na invocação de funções Chamada por valor

Cópia do(s) argumento(s) passado(s) para a função

Alterações do(s) argumento(s) na função não exercem influência sobre o(s) valor(es) original(ais)

Uso quando não há necessidade de alteração do argumento pela função

Prevenção contra alterações acidentais

Uso na invocação de funções Chamada por valor

Cópia do(s) argumento(s) passado(s) para a função

Alterações do(s) argumento(s) na função não exercem influência sobre o(s) valor(es) original(ais)

Uso quando não há necessidade de alteração do argumento pela função

Prevenção contra alterações acidentais

Page 26: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2626

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.8 Chamada de Funções por Valor e por Referência

5.8 Chamada de Funções por Valor e por Referência

Chamada por referência

Passagem do(s) argumento(s) original(ais)

Alterações do(s) argumento(s) na função implicam alterações no(s) original(ais)

Uso apenas com funções confiáveis que precisem modificar a variável original

Foco atual Chamada por valor

Chamada por referência

Passagem do(s) argumento(s) original(ais)

Alterações do(s) argumento(s) na função implicam alterações no(s) original(ais)

Uso apenas com funções confiáveis que precisem modificar a variável original

Foco atual Chamada por valor

Page 27: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2727

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.9 Geração de Números Aleatórios

5.9 Geração de Números Aleatórios

Função rand Inclusão de <stdlib.h> Retorno de um número “aleatório” entre 0 and RAND_MAX (pelo menos 32767)

i = rand();

Pseudo-aleatoriedade Seqüência pré-definida de números “aleatórios”

Mesma seqüência para qualquer chamada à função

Função rand Inclusão de <stdlib.h> Retorno de um número “aleatório” entre 0 and RAND_MAX (pelo menos 32767)

i = rand();

Pseudo-aleatoriedade Seqüência pré-definida de números “aleatórios”

Mesma seqüência para qualquer chamada à função

Page 28: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2828

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.9 Geração de Números Aleatórios

5.9 Geração de Números Aleatórios

Ajuste de Escala Obtenção de um número aleatório entre 1 e n

1 + ( rand() % n )

rand() % n retorna um número entre 1 e n-1 Adição de 1 para gerar um número aleatório

entre 1 e n

1 + ( rand() % 6)

Número entre 1 e 6

Ajuste de Escala Obtenção de um número aleatório entre 1 e n

1 + ( rand() % n )

rand() % n retorna um número entre 1 e n-1 Adição de 1 para gerar um número aleatório

entre 1 e n

1 + ( rand() % 6)

Número entre 1 e 6

Page 29: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

2929

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Função srand Inclusão de <stdlib.h> Definição de uma “semente” (seed) inteira e

deslocamento de sua seqüência “aleatória” para aquela locação

srand( seed );

srand( time( NULL ) ); // inclusão de <time.h>time( NULL )

Retorno do tempo no qual o program foi compilado (em segundos)

“Aleatorização" da semente

Função srand Inclusão de <stdlib.h> Definição de uma “semente” (seed) inteira e

deslocamento de sua seqüência “aleatória” para aquela locação

srand( seed );

srand( time( NULL ) ); // inclusão de <time.h>time( NULL )

Retorno do tempo no qual o program foi compilado (em segundos)

“Aleatorização" da semente

5.9 Geração de Números Aleatórios

5.9 Geração de Números Aleatórios

Page 30: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3030

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.9 Geração de Números Aleatórios

5.9 Geração de Números Aleatórios

01 Programa para randomização no lançamento de um dado */02 #include <stdlib.h>03 #include <stdio.h>0405 int main()06 {07 int i;08 unsigned semente;09 10 printf( “Digite a semente: " );11 scanf( "%u", &semente );12 srand(semente);13 for ( i = 1; i <= 10; i++ ) {14 printf( "%10d", 1 + ( rand() % 6 ) );15 if ( i % 5 == 0 )16 printf( "\n" );17 }18 return 0;19 }

Digite a semente:Digite a semente: 867867 2 4 6 1 62 4 6 1 6 1 1 3 6 2 1 1 3 6 2

Digite a semente:Digite a semente: 867867 2 4 6 1 62 4 6 1 6 1 1 3 6 2 1 1 3 6 2

Digite a semente: 67Digite a semente: 67 6 1 4 6 26 1 4 6 2 1 6 1 6 4 1 6 1 6 4

Digite a semente: 67Digite a semente: 67 6 1 4 6 26 1 4 6 2 1 6 1 6 4 1 6 1 6 4

Page 31: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3131

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.10 Exemplo: Jogo de Azar5.10 Exemplo: Jogo de Azar

Simulador de Craps

Regras Lançamento de dois dados

7 ou 11 na primeira rodada, o jogador vence

2, 3 ou 12 na primeira rodada (craps), o jogador perde (i.e. a casa vence)

4, 5, 6, 8, 9 ou 10 na primeira rodada, a soma torna-se o “ponto” do jogador

Jogador ganhará se continuar lançando os dados até fazer seu ponto e isto ocorrer antes de obter 7 como resultado

Simulador de Craps

Regras Lançamento de dois dados

7 ou 11 na primeira rodada, o jogador vence

2, 3 ou 12 na primeira rodada (craps), o jogador perde (i.e. a casa vence)

4, 5, 6, 8, 9 ou 10 na primeira rodada, a soma torna-se o “ponto” do jogador

Jogador ganhará se continuar lançando os dados até fazer seu ponto e isto ocorrer antes de obter 7 como resultado

Page 32: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3232

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

01 /* Simulador de Craps */02 #include <stdio.h>03 #include <stdlib.h>04 #include <time.h>0506 int rola_dados( void );0708 int main()09 {10 int placar, soma, ponto;1112 srand( time( NULL ) );13 soma = rola_dados(); /* primeiro lançamento dos dados */14 switch ( soma ) {15 case 7: case 11: /* ganha na primeira rodada */16 placar = 1;17 break;18 case 2: case 3: case 12: /* perde na primeira rodada */19 placar = 2;20 break;21 default: /* armazena ponto */22 placar = 0;23 ponto = soma;24 printf( “O total de pontos eh %d\n", ponto );25 break;26 }27 while (placar == 0) { /* continua jogando */28 soma = rola_dados();

5.10 Exemplo: Jogo de Azar5.10 Exemplo: Jogo de Azar

Page 33: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3333

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.10 Exemplo: Jogo de Azar5.10 Exemplo: Jogo de Azar

29 if (soma == ponto) /* vence fazendo ponto */30 placar = 1;31 else32 if (soma == 7) /* perde obtendo o valor 7 */33 placar = 2;34 }35 if (placar == 1)36 printf( “O jogador venceu\n" );37 else38 printf( " O jogador perdeu\n " );39 return 0;40 }41 int rola_dados( void )42 {43 int dado1, dado2, soma;44 dado1 = 1 + ( rand() % 6 );45 dado2 = 1 + ( rand() % 6 );46 soma = dado1 + dado2;47 printf( “O jogador lançou %d + %d = %d vezes\n", dado1, dado2, soma );48 return soma;49 }

O jogador lançou 6 + 5 = 11O jogador lançou 6 + 5 = 11O jogadorO jogador venceuvenceuO jogador lançou 6 + 5 = 11O jogador lançou 6 + 5 = 11O jogadorO jogador venceuvenceu

O jogador lançou 6 + 6 = 12O jogador lançou 6 + 6 = 12O jogador perdeuO jogador perdeuO jogador lançou 6 + 6 = 12O jogador lançou 6 + 6 = 12O jogador perdeuO jogador perdeu

O jogador lançou 4 + 6 = 10O jogador lançou 4 + 6 = 10O total de pontos eh 10O total de pontos eh 10O jogador lançou 2 + 4 = 6O jogador lançou 2 + 4 = 6O jogador lançouO jogador lançou 6 + 5 = 116 + 5 = 11O jogador lançouO jogador lançou 3 + 3 = 63 + 3 = 6O jogador lançouO jogador lançou 6 + 4 = 106 + 4 = 10O jogador venceuO jogador venceu

O jogador lançou 4 + 6 = 10O jogador lançou 4 + 6 = 10O total de pontos eh 10O total de pontos eh 10O jogador lançou 2 + 4 = 6O jogador lançou 2 + 4 = 6O jogador lançouO jogador lançou 6 + 5 = 116 + 5 = 11O jogador lançouO jogador lançou 3 + 3 = 63 + 3 = 6O jogador lançouO jogador lançou 6 + 4 = 106 + 4 = 10O jogador venceuO jogador venceu

O jogador lançou 1 + 3 = 4O jogador lançou 1 + 3 = 4O total de pontos eh 4O total de pontos eh 4O jogador lançou 1 + 4 = 5O jogador lançou 1 + 4 = 5O jogador lançouO jogador lançou 5 + 4 = 95 + 4 = 9O jogador lançouO jogador lançou 4 + 6 = 104 + 6 = 10O jogador lançouO jogador lançou 6 + 3 = 96 + 3 = 9O jogador lançouO jogador lançou 1 + 2 = 31 + 2 = 3O jogador lançouO jogador lançou 5 + 2 = 75 + 2 = 7O jogador perdeuO jogador perdeu

O jogador lançou 1 + 3 = 4O jogador lançou 1 + 3 = 4O total de pontos eh 4O total de pontos eh 4O jogador lançou 1 + 4 = 5O jogador lançou 1 + 4 = 5O jogador lançouO jogador lançou 5 + 4 = 95 + 4 = 9O jogador lançouO jogador lançou 4 + 6 = 104 + 6 = 10O jogador lançouO jogador lançou 6 + 3 = 96 + 3 = 9O jogador lançouO jogador lançou 1 + 2 = 31 + 2 = 3O jogador lançouO jogador lançou 5 + 2 = 75 + 2 = 7O jogador perdeuO jogador perdeu

Page 34: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3434

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.11 Classes de Armazenamento

5.11 Classes de Armazenamento

IDENTIFICADORES

variáveis Possuem um nome, um tipo e um valor

funções Possuem nome, tipo, valor e parâmetros

IDENTIFICADORES

variáveis Possuem um nome, um tipo e um valor

funções Possuem nome, tipo, valor e parâmetros

IDENTIFICADORES também possuem

Classes de armazenamento, tempo de validade, escopo e ligação.

IDENTIFICADORES também possuem

Classes de armazenamento, tempo de validade, escopo e ligação.

Page 35: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3535

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.11 Classes de Armazenamento

5.11 Classes de Armazenamento

Especificadores de classes de armazenamento auto, register, extern e static

Tempo (ou duração) de Armazenamento Período durante o qual o identificador permanece na memória

Escopo Local no qual o objeto pode ser referenciado no programa

Linkage (ligação) Especificação dos arquivos nos quais um identificador é conhecido

Especificadores de classes de armazenamento auto, register, extern e static

Tempo (ou duração) de Armazenamento Período durante o qual o identificador permanece na memória

Escopo Local no qual o objeto pode ser referenciado no programa

Linkage (ligação) Especificação dos arquivos nos quais um identificador é conhecido

Page 36: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3636

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.11 Classes de Armazenamento

5.11 Classes de Armazenamento

Armazenamento Automático Criação do objeto quando o bloco no qual é

declarado for acionado Existência do objeto enquanto o bloco estiver

ativo Destruição do objeto quando o bloco for

descartado auto Default para variáveis locais

auto double x, y;

register Tentativa de conservação de uma variável em um registrador de alta velocidade

Uso apenas para variáveis automáticasregister int counter = 1;

Armazenamento Automático Criação do objeto quando o bloco no qual é

declarado for acionado Existência do objeto enquanto o bloco estiver

ativo Destruição do objeto quando o bloco for

descartado auto Default para variáveis locais

auto double x, y;

register Tentativa de conservação de uma variável em um registrador de alta velocidade

Uso apenas para variáveis automáticasregister int counter = 1;

Page 37: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3737

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.11 Classes de Armazenamento

5.11 Classes de Armazenamento

Armazenamento Estático Existência das variáveis durante toda a execução

do programa Valor default: zero static Variáveis locais definidas em funções

Manutenção do valor após o término da função

Conhecimento apenas pela própria função

extern Default para variáveis globais e nomes de funções

Conhecimento por qualquer função

Armazenamento Estático Existência das variáveis durante toda a execução

do programa Valor default: zero static Variáveis locais definidas em funções

Manutenção do valor após o término da função

Conhecimento apenas pela própria função

extern Default para variáveis globais e nomes de funções

Conhecimento por qualquer função

Page 38: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3838

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.12 Regras de Escopo

5.12 Regras de Escopo

Escopo de Arquivo Identificador definido fora da função, conhecido

por todas as funções

Uso para variáveis globais, definições de funções, protótipos de funções

Escopo de Função

Referência possível apenas dentro do corpo de uma função

Uso apenas para rótulos (start:, case:, etc.)

Escopo de Arquivo Identificador definido fora da função, conhecido

por todas as funções

Uso para variáveis globais, definições de funções, protótipos de funções

Escopo de Função

Referência possível apenas dentro do corpo de uma função

Uso apenas para rótulos (start:, case:, etc.)

Page 39: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

3939

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Escopo de Bloco Declaração de um identificador dentro do bloco

Início do escopo do bloco na declaração ‘{‘

Término do escopo do bloco na chave direita ‘}’

Uso para variáveis e parâmetros de funções (variáveis locais de funções )

“Ocultação“ de blocos exteriores dos blocos interiores se houver variáveis com nomes iguais em ambos os blocos

Escopo de Protótipo de Função

Uso para identificadores em listas de parâmetros

Escopo de Bloco Declaração de um identificador dentro do bloco

Início do escopo do bloco na declaração ‘{‘

Término do escopo do bloco na chave direita ‘}’

Uso para variáveis e parâmetros de funções (variáveis locais de funções )

“Ocultação“ de blocos exteriores dos blocos interiores se houver variáveis com nomes iguais em ambos os blocos

Escopo de Protótipo de Função

Uso para identificadores em listas de parâmetros

5.12 Regras de Escopo

5.12 Regras de Escopo

Page 40: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4040

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.8 Variáveis globais5.8 Variáveis globais

Acesso a partir de qualquer função

Declarar antes do main() Exemplo:

Acesso a partir de qualquer função

Declarar antes do main() Exemplo:

#include ...void lerdados(); /* protótipo da função */float nota; /* variável global */main(){ float melhor_nota; .. melhor_nota = nota; ..}void lerdados() /* função */{ ... scanf(("%s", &nota); ...}

Page 41: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4141

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.8 Variáveis globais5.8 Variáveis globais#include <stdio.h>#include <string.h>void lerdados();char nome[20]="";float nota;

int main(){ char melhor_aluno[20]=""; int contador; float media, melhor_nota, soma;

/* Inicialização */ soma = 0; contador = 0; lerdados(); /* chamada da função */

/* Processamento */ melhor_nota = nota; strcpy(melhor_aluno, nome); while (nota != -1) {soma = soma+nota; contador = contador + 1; lerdados(); /* chamada da função */

#include <stdio.h>#include <string.h>void lerdados();char nome[20]="";float nota;

int main(){ char melhor_aluno[20]=""; int contador; float media, melhor_nota, soma;

/* Inicialização */ soma = 0; contador = 0; lerdados(); /* chamada da função */

/* Processamento */ melhor_nota = nota; strcpy(melhor_aluno, nome); while (nota != -1) {soma = soma+nota; contador = contador + 1; lerdados(); /* chamada da função */

if (nota > melhor_nota) {melhor_nota = nota; strcpy(melhor_aluno, nome); } }/* Finalização */ if (contador != 0) {media = soma / contador; printf("\nA media da turma e: \n%.2f", media); printf("O melhor aluno eh: %s", melhor_aluno); printf(" com a nota %.2f", melhor_nota); } else printf("\nNenhum aluno digitado."); return 0;}void lerdados(){ printf("Digite o nome do proximo aluno: "); scanf("%s", &nome); printf("\nDigite a nota deste aluno: "); scanf("%f", &nota); return;}

Page 42: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4242

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

01 /* Exemplo de escopo */02 #include <stdio.h>03 void a(void); /* protótipo da função a */04 void b(void); /* protótipo da função b */05 void c(void); /* protótipo da função c */06 int x = 1; /* variável global */07 int main()08 {09 int x = 5; /* variável local para main */10 printf(“x local no escopo externo de main é %d\n", x );11 { /* início de um novo escopo */12 int x = 7;13 printf( “x local no escopo interno de main é %d\n", x );14 } /* término do novo escopo */15 printf( “x local no escopo externo de main é %d\n", x );16 a(); /* a contém x local automática */17 b(); /* b contém x local estática*/18 c(); /* c usa x global */19 a(); /* a reinicializa x local automática */20 b(); /* x local estática mantém seu valor anterior */21 c(); /* x global também mantém seu valor */

5.12 Regras de Escopo

5.12 Regras de Escopo

22 printf( “x local em main é %d\n", x );23 return 0;24 }

Page 43: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4343

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.12 Regras de Escopo

5.12 Regras de Escopo

25 void a(void)26 {27 int x = 25; /* inicializada a cada vez em que a é chamada */28 printf( "\nx local em a é %d depois de entrar em a\n", x );29 ++x;30 printf( "x local em a é %d antes de sair de a\n", x );31 }32 void b(void)33 {34 static int x = 50; /* inicializa somente na primeira vez em que b é chamada */35 printf( "\nx local estática é %d ao entrar em b\n", x );36 ++x;37 printf( " x local estática é %d ao sair de b\n", x );38 }39 void c(void)40 {41 printf( "\n x global é %d ao entrar em c\n", x );42 x *= 10;43 printf( " x global eh %d ao sair de c\n", x );44 }

Page 44: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4444

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

x local no escopo externo de main é 5x local no escopo externo de main é 5x local no escopo interno de main é 7x local no escopo interno de main é 7x local no escopo externo de main é 5x local no escopo externo de main é 5 x local em a é 25 depois de entrar em ax local em a é 25 depois de entrar em ax local em a é 26 antes de sair de ax local em a é 26 antes de sair de a x local estática é 50 ao entrar em bx local estática é 50 ao entrar em bx local estática é 51 ao sair de bx local estática é 51 ao sair de b x global é 1 ao entrar em cx global é 1 ao entrar em cx global é 10 ao sair de cx global é 10 ao sair de c x x locallocal em a é 25 depois de entrar a em a é 25 depois de entrar ax local em a éx local em a é 26 antes de sair de a 26 antes de sair de a x local estática é 51 ao entrar em bx local estática é 51 ao entrar em bx local estática é 52 ao sair de bx local estática é 52 ao sair de b x global é 10 ao entrar em cx global é 10 ao entrar em cx global é 100 ao sair de cx global é 100 ao sair de cx local em main é 5x local em main é 5

5.12 Regras de Escopo

5.12 Regras de Escopo

Page 45: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4545

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.13 Recursividade

5.13 Recursividade

Funções Recursivas Auto-chamadas

Possibilidade de solução apenas de um caso básico

Fragmentação de um problema em

O que é possível fazer

O que não é possível fazer Necessidade de tal parte do problema se assemelhe ao

problema original (versão mais simples ou menor) Função Chamada a uma nova cópia de si própria

(chamada recursiva ou etapa de recursão) para a solução do que não é possível fazer

Funções Recursivas Auto-chamadas

Possibilidade de solução apenas de um caso básico

Fragmentação de um problema em

O que é possível fazer

O que não é possível fazer Necessidade de tal parte do problema se assemelhe ao

problema original (versão mais simples ou menor) Função Chamada a uma nova cópia de si própria

(chamada recursiva ou etapa de recursão) para a solução do que não é possível fazer

Page 46: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4646

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.13 Recursividade

5.13 Recursividade

Funções Recursivas

Caso básico eventualmente solucionado

Extensão, processamento e solução do problema como um todo

Funções Recursivas

Caso básico eventualmente solucionado

Extensão, processamento e solução do problema como um todo

Page 47: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4747

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Exemplo Fatoriais

5! = 5 * 4 * 3 * 2 * 1

Importante observar que 5! = 5 * 4!

4! = 4 * 3! ...

Possibilidade de computação recursiva de factoriais

Solução do caso básico (1!=0!=11!=0!=1) e extensão para

2! = 2 * 1! = 2 * 1 = 2;

3! = 3 * 2! = 3 * 2 = 6;

Exemplo Fatoriais

5! = 5 * 4 * 3 * 2 * 1

Importante observar que 5! = 5 * 4!

4! = 4 * 3! ...

Possibilidade de computação recursiva de factoriais

Solução do caso básico (1!=0!=11!=0!=1) e extensão para

2! = 2 * 1! = 2 * 1 = 2;

3! = 3 * 2! = 3 * 2 = 6;

5.13 Recursividade

5.13 Recursividade

Page 48: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4848

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.14 Exemplo de Uso de Recursividade: Série de Fibonacci

5.14 Exemplo de Uso de Recursividade: Série de Fibonacci

Série de Fibonacci (0, 1, 1, 2, 3, 5, 8...) Cada número é a soma dos dois anteriores

Possibilidade de solução recursiva

fib( n ) = fib( n - 1 ) + fib( n – 2 )fib( n ) = fib( n - 1 ) + fib( n – 2 )

Código para a função fibonaccifibonacci

long fibonacci( long n ){

if (n == 0 || n == 1) // caso básico return n;

else return fibonacci(n – 1) + fibonacci(n – 2);}

Série de Fibonacci (0, 1, 1, 2, 3, 5, 8...) Cada número é a soma dos dois anteriores

Possibilidade de solução recursiva

fib( n ) = fib( n - 1 ) + fib( n – 2 )fib( n ) = fib( n - 1 ) + fib( n – 2 )

Código para a função fibonaccifibonacci

long fibonacci( long n ){

if (n == 0 || n == 1) // caso básico return n;

else return fibonacci(n – 1) + fibonacci(n – 2);}

 

Page 49: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

4949

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

return return 00

f(2)f(2)

f(0)f(0)

return return 11

Série de chamadas recursivas à função fibonaccifibonacci

Série de chamadas recursivas à função fibonaccifibonacci

 

5.14 Exemplo de Uso de Recursividade: Série de Fibonacci

5.14 Exemplo de Uso de Recursividade: Série de Fibonacci

f(1)f(1) return return 11returnreturn

returnreturn ++

++

f(3)f(3)

f(1)f(1)

Page 50: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

5050

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.14 Exemplo de Uso de Recursividade: Série de Fibonacci

5.14 Exemplo de Uso de Recursividade: Série de Fibonacci

01 /* Função recursiva da Série de Fibonacci */02 #include <stdio.h>0304 long fibonacci(long);05 int main()06 {07 long resultado, numero;0809 printf(“Digite um inteiro: ");10 scanf( "%ld", &numero );11 resultado = fibonacci(numero);12 printf("Fibonacci( %ld ) = %ld\n", numero, resultado);13 return 0;14 }15 /* Definição recursiva da função fibonacci */16 long fibonacci(long n)17 {18 if (n == 0 || n == 1)19 return n;20 else21 return fibonacci(n - 1) + fibonacci(n - 2);22 }

Page 51: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

5151

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Digite um inteiro: 2Digite um inteiro: 2Fibonacci(2) = 1Fibonacci(2) = 1 Digite um inteiro : 3Digite um inteiro : 3Fibonacci(3) = 2Fibonacci(3) = 2 Digite um inteiro : 4Digite um inteiro : 4Fibonacci(4) = 3Fibonacci(4) = 3 Digite um inteiro : 5Digite um inteiro : 5Fibonacci(5) = 5Fibonacci(5) = 5 Digite um inteiro : 6Digite um inteiro : 6Fibonacci(6) = 8Fibonacci(6) = 8 Digite um inteiro : 10Digite um inteiro : 10Fibonacci(10) = 55Fibonacci(10) = 55 Digite um inteiro : 20Digite um inteiro : 20Fibonacci(20) = 6765Fibonacci(20) = 6765 Digite um inteiro : 30Digite um inteiro : 30Fibonacci(30) = 832040Fibonacci(30) = 832040

5.14 Exemplo de Uso de Recursividade: Série de Fibonacci

5.14 Exemplo de Uso de Recursividade: Série de Fibonacci

Exemplo de SaídaExemplo de Saída

Page 52: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

5252

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.15 Recursividade vs. Iteração

5.15 Recursividade vs. Iteração

Repetição Iteração Laço explícito

Recursividade Chamadas repetidas à função

Terminação Iteração Falha na condição do laço

Recursividade Reconhecimento do caso básico

Iteração/Recursividade Possibilidade de laços infinitos

Repetição Iteração Laço explícito

Recursividade Chamadas repetidas à função

Terminação Iteração Falha na condição do laço

Recursividade Reconhecimento do caso básico

Iteração/Recursividade Possibilidade de laços infinitos

Page 53: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

5353

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

5.15 Recursividade vs. Iteração

5.15 Recursividade vs. Iteração

Ponto de Equilíbrio

Ponderação entre desempenho (iteração) e qualidade da engenharia de software (recursividade )

Ponto de Equilíbrio

Ponderação entre desempenho (iteração) e qualidade da engenharia de software (recursividade )

Page 54: Rangel@dsc.ufpb.br DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.

ran

gel@

dsc.u

fpb

.br

DSC/CCT/UFCGDSC/CCT/UFCG

José Eustáquio Rangel de QueirozRoberto Medeiros de Faria

Ulrich Schiel

José Eustáquio Rangel de QueirozRoberto Medeiros de Faria

Ulrich Schiel

DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃODEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO

UNIVERSIDADE FEDERAL DE CAMPINA GRANDEUNIVERSIDADE FEDERAL DE CAMPINA GRANDE

CENTRO DE CIÊNCIAS E TECNOLOGIACENTRO DE CIÊNCIAS E TECNOLOGIA