Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Laboratório de Programação I
DESENVOLVIMENTO DE MACROS,
FUNÇÕES RECURSIVAS E A
DEFINIÇÃO DE NOVOS TIPOS
02/03/2013 Jair Alves Barbosa
02/03/2013 Laboratório de Programação I 2
A diretiva #define pode ser usada na substituição de
textos que tenham um significado explicito ao compilador.
Por exemplo:
#include<stdio.h>
#include<conio.c>
#define ERRO printf("\nVALOR INVALIDO.\n")
int main(void)
{
int nro;
printf("Informe um numero de 1 a 10: ");
scanf("%d",&nro);
if ((nro < 1) || (nro > 10))
ERRO;
else
printf("Valor pertencente ao intervalo.");
getch();
} // encerra o programa
MACROS
02/03/2013 Laboratório de Programação I 3
MACROS
• Esta diretiva também pode receber argumentos para serem
utilizados no momento de sua execução no programa.
#define MOSTRA(p1) printf("%f\n", p1)
int main (void) { // abrindo o bloco de instruções
float valor;
printf("Informe o valor desejado: ");
scanf("%f", &valor);
MOSTRA(valor);
valor = valor * 3;
MOSTRA(valor);
getch(); } // encerra o bloco de instruções
VALOR é substituído pelo nome usado
na macro
02/03/2013 Laboratório de Programação I 4
MACROS
• Macros são definidas através da diretiva define
podendo ter parâmetros;
• Cada vez que o nome da macro é encontrado, os
parâmetros usados na sua definição são substituídos
pelos parâmetros encontrados no programa antes da
compilação do programa;
• Não é especificado o tipo de dado do parâmetro;
• As macros diminuem o tempo de execução do
programa, mas aumentam o seu código (duplicação);
• Cuidados com a sintaxe na realização de expressões.
02/03/2013 Laboratório de Programação I 5
MACROS
A não utilização de parênteses nas macros pode resultar
em erros na efetivação de uma expressão.
Exemplo:
#define SOMAR(p1,p2) p1 + p2
int main (void) { // abrindo o bloco de instruções
int valor_1, valor_2, total;
printf("Informe os valores: ");
scanf("%d %d",&valor_1, &valor_2);
total = 10 * SOMAR(valor_1,valor_2);
printf("Resultado = %d", total);
getch(); } // encerra o bloco de instruções
Supondo que os valores informados sejam 3 para valor_1 e 5
para valor_2 o resultado é 35 ao invés de 80 como esperado.
Resultado = 35
ao invés de
Resultado = 80
02/03/2013 Laboratório de Programação I 6
MACROS
A solução neste exemplo seria incluir todo o texto
envolvido por parênteses .
#define SOMAR(p1,p2) (p1 + p2)
No exemplo anterior a solução acima funcionaria e o
resultado seria o esperado, porém envolvendo todo o texto entre
parênteses não soluciona todos os problemas. Por exemplo:
#define MULTIPLICAR(p1,p2) (p1 * p2)
...
Resultado = MULTIPLICAR (2+3,4);
Após a substituição do texto tem-se a expressão:
Resultado = (2+3*4); // resultado 14
onde o valor desejado seria vinte (20).
A solução é envolver cada parâmetro por parênteses
#define MULTIPLICAR (p1,p2) ( (p1) * (p2) )
Resultado = ((2+3)*(4));// resultado 20
02/03/2013 Laboratório de Programação I 7
Exercícios de Fixação
1) Desenvolva um programa que use uma macro para
calcular a área de um retângulo, sendo informado os
valores reais da base e da altura (base . altura).
2) Fazer uma macro para calcular a área de uma esfera,
dado o raio (4 . . R2).
3) Elabore um programa que use uma macro para retornar o
valor da média aritmética de três valores numéricos
informados pelo usuário.
4) Faça um programa que use uma macro para determinar a
quantidade de raízes de uma equação do segundo grau
que pode ser 0,1 ou 2.
02/03/2013 Laboratório de Programação I 8
Uma função é recursiva quando dentro dela existe uma
chamada a ela própria.
Um código recursivo precisa usar mais memória, o que torna
a execução mais lenta. Quando uma função chama a si mesmo
novos parâmetros e variáveis locais são alocados na pilha e o
código da função é executado com essas novas variáveis.
Uma chamada recursiva não faz uma nova cópia da função,
mas apenas os seus argumentos são novos. Quando a função
recursiva retorna, as variáveis locais e os parâmetros são
removidos da pilha, a execução recomeça do ponto da chamada à
função dentro da função.
O objetivo de uma função recursiva, também denominada de
recorrência, é fazer com que ela passe por uma seqüência de
chamadas até que um certo ponto seja atingido (resolvido).
Funções Recursivas
02/03/2013 Laboratório de Programação I 9
Toda função recursiva deve possuir um comando condicional (if)
em algum lugar, forçando a função a retornar sem que a chamada
recursiva ocorra (condição de escape).
Exemplo:
#include<stdio.h>
#include<conio.c>
int fatorial(int n) ; // protótipo
int main(void) {
int um = 1;
while(num) {
printf("\nDigite um numero: ");
scanf("%d",&num);
printf("Fatorial = %ld“,fatorial(num));
}
getch();
}
Funções Recursivas
// Definição da função
long fatorial (int n)
{
if (n == 0) return (1) ;
else
return( fatorial(n-1) * n);
}
Saída => 1*2*3*4*5 = ?
0 = 1
1 =
2 =
3 =
4 =
5 =
1
2
6
24
120
02/03/2013 Laboratório de Programação I 10
Exercício de Fixação
5)Escrever uma função recursiva (Potencia) que
receba uma base real e um expoente inteiro e
retorne o valor da base elevada ao expoente.
Escrever também um programa para testar
(executar) esta função.
02/03/2013 Laboratório de Programação I 11
CRIANDO TIPOS DE DADOS
Um tipo de dado pode ser criado pelo usuário, além dos
tipos definidos. Também é possível definir um novo nome
para um tipo de dado já existente, aumentando assim, a
portabilidade e melhorando a documentação dos programas.
typedef <tipo> <novo_nome>;
Exemplos:
typedef float NOTA;
NOTA nota_aluno;
typedef char CORDAO[20];
CORDAO apelido;
printf(“Qual o apelido: “);
gets(apelido);
printf(“Apelido=%s”, apelido);
tipo
de
dado
nome da variável
02/03/2013 Laboratório de Programação I 12
Exercício de Fixação
6)Faça um programa que identifique o signo do zodíaco
correspondente a uma data (dia/mês) qualquer. O
usuário do programa poderá solicitar vários signos sem
precisar estar iniciando o programa todas as vezes que
desejar. A tabela abaixo identifica o último dia de cada
mês e o signo correspondente. Encerrando os dados
tem-se que de 22 à 31 de Dezembro o signo também é
Capricórnio.
Mês Último dia Signo
Jan 20 Capricórnio
Fev 19 Aquário
Mar 20 Peixes
Abr 20 Áries
Maio 20 Touro
Jun 20 Gêmeos
Mês Último dia Signo
Jul 21 Câncer
Ag 22 Leão
Set 22 Virgem
Out 22 Libra
Nov 21 Escorpião
Dez 21 Sagitário
02/03/2013 Laboratório de Programação I 13
Exercício de Fixação
7)Elabore um programa, com uma função recursiva, que
retorne como resultado o valor do termo baseado na
sequencia de Fibbonaci.
Seqüência de Fibbonaci:
1 1 2 3 5 8 13 21 34 ... Seqüência
01 02 03 04 05 06 07 08 09 ... Termos
8)Escrever uma função recursiva (converteBinario) que
receba um número inteiro e apresente a sua conversão
para a base 2.
7 1 1 1
5 1 0 1
02/03/2013 Laboratório de Programação I 14
Exercício de Fixação
9) Alterar o exercício 8 para que a representação do
número na base 2 seja armazenada em uma string cujo
endereço será passado como parâmetro
02/03/2013
Laboratório de Programação I 15
Referência de Criação e Apoio ao Estudo
Material para Consulta e Apoio ao Conteúdo
• Universidade Federal de Minas Gerais - site
ead1.eee.ufmg.br/cursos (escolha a opção ‘C’)
• SCHILDT, H., C Completo e Total, Editora Makron
Books do Brasil Editora Ltda, 1996.
Capítulo 6, 7 e 10
• EVARISTO, J., Aprendendo a programar programando
em C, Book Express, 205 p., 2001.
Capítulo 5 e 8
• MIZRAHI, V. V., Treinamento em Linguagem C, Curso
Completo, Módulo 1, Makron Books do Brasil Editora
Ltda,1990.
Capítulo 5