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