Upload
internet
View
102
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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", ¬a); return;}
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
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
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)
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>
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
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;}
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
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
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
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
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
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
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
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
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
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.
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
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;
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
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.)
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
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", ¬a); ...}
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", ¬a); return;}
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 }
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 }
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
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
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
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
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);}
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)
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 }
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
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
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 )
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