UNIBRATEC Ensino Superior e Tcnico em Informtica DHD
UNIBRATEC – Ensino Superior e Técnico em Informática DHD – Desenvolvimento em Hardware 1 Aula 8 – Função, Constante. Básicos e Macro Capítulo 1 – Conceitos Tuesday, September 7, 7, 2021
8 UNIBRATEC – Ensino Superior e Técnico em Informática DHD – Desenvolvimento em Hardware Função, Constante e Macro 1. 2. 3. Funções Constantes Macros Prof. Frederico Brito Fernandes unibratec@fredbf. com 2 Aula 8 – Função, Constante. Básicos e Macro Capítulo 1 – Conceitos Tuesday, September 7, 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: sintaxe • Sintaxe: tipo_de_retorno nome_da_função (declaração_de_parâmetros){ corpo_da_função A palavra ‘return’ provoca o final da função return tipo_de_retorno } • Ex 1: #include <stdio. h> int quadrado (int a){ return (a*a); } int main (){ Também poderia ser declarado da forma: #include <stdio. h> quadrado (int a){ return (a*a); } Pois o tipo de retorno default é int num; printf ("Entre com um numero: "); scanf ("%d", &num); printf ("nn. O seu quadrado vale: %dn", quadrado(num)); return 0; } 3 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: exemplos de return • Ex 2: #include <stdio. h> int eh. Par (int a){ if (a%2) /* Verifica se a e divisivel por dois */ return 0; /* Retorna 0 se nao for divisivel */ else return 1; /* Retorna 1 se for divisivel */ return -1; Por que esse ‘return’ } É possível ter mais de um ‘return’ na função! aqui está estranho? int main (){ int num; printf ("Entre com numero: "); scanf ("%d", &num); if (eh. Par(num)) printf ("nn. O numero e par. n"); else printf ("nn. O numero e impar. n"); return 0; } 4 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função • Auto-avaliação – Escreva a função ‘eh. Divisivel(int a, int b)' (tome como base eh. Par(int a)). A função deverá retornar 1 se o resto da divisão de a por b for zero. Caso contrário, a função deverá retornar zero. Ex: eh. Divisivel(9, 3) retorna 1 eh. Divisivel(20, 6) retorna 0 5 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: problema • Ex 1: qual o erro de sintaxe do programa abaixo? #include <stdio. h> int main (){ float num; printf ("Entre com um numero: "); scanf ("%f", &num); printf ("nn. O seu quadrado vale: %fn", quadrado(num)); return 0; } float quadrado (float a) { return (a*a); } 6 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: protótipos • Protótipos (cabeçalhos) de funções – Servem para declarar o tipo de retorno da função, assim como o número e tipo dos parâmetros • Sintaxe: tipo_de_retorno nome_da_função (declaração_de_parâmetros); • Ex: #include <stdio. h> Protótipo da função float quadrado (float a); quadrado() int main (){ float num; printf ("Entre com um numero: "); scanf ("%f", &num); printf ("nn. O seu quadrado vale: %. 1 fn", quadrado(num)); return 0; } float quadrado (float a) { Implementação da return (a*a); função quadrado() } 7 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: criando arquivos-cabeçalho • Objetivo – Separar conceitos diferentes em arquivos diferentes • Ex: #include <stdio. h> float quadrado (float a); int main (){ Protótipo da função quadrado() #include “mat. h” float num; printf ("Entre com um numero: "); scanf ("%f", &num); printf ("nn. O seu quadrado vale: %fn", quadrado(num)); return 0; } float quadrado (float a) { return (a*a); } 8 Implementação da função quadrado() Aula 8 – Função, Constante e Macro mat. h float quadrado (float a); mat. c float quadrado (float a) { return (a*a); } Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: criando arquivos-cabeçalho • Auto-avaliação – Crie um projeto no Dev. C++ ou Turbo. C++, depois crie os 3 arquivos abaixo, e execute o projeto Teste. c mat. h #include <stdio. h> #include <conio. h> #include "mat. h" int main (){ float num; printf ("Entre com um numero: "); scanf ("%f", &num); printf ("nn. O seu quadrado vale: %. 1 fn", quadrado(num)); getch(); return 0; } 9 Aula 8 – Função, Constante e Macro float quadrado (float a); mat. c float quadrado (float a) { return (a*a); } Obs: a aspa-dupla indica que o arquivo mat. h e mat. c encontram-se na mesma pasta do programa principal Teste. c Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: tipo void • void – Significa nulo em inglês – Usado em funções que: • Não retornam nada • Não possuem parâmetros – Ex: #include <stdio. h> void Mensagem (void); int main (){ Mensagem(); printf ("t. Diga de novo: n"); Mensagem(); return 0; } void Mensagem (void){ printf ("Ola! Eu estou vivo. n"); } 10 Aula 8 – Função, Constante e Macro Lembre-se: Quando não declarado o: 1. (1) tipo de retorno, então, por default ele é do tipo int Ex 2: maior (int a, int b){ // retorna int return (a>b; a; b); } 1. (2) parâmetro, então, por default ele é void Ex 3: void Mensagem (){ // parâmetro void printf ("Ola! n"); } Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: passagem de parâmetros • A passagem de parâmetros em C é sempre por valor – Significa dizer que uma cópia do parâmetro real é colocada no parâmetro formal • Ex: #include <stdio. h> int antecessor (int a); Parâmetro Formal int main (){ int b=2; Parâmetro Real printf ("t. Diga de novo: n, %d“, antecessor(b)); printf(“%d”, b); // qual valor será impresso aqui? 2 ou 1? return 0; } int Mensagem (int a){ ATENÇÃO a = a - 1; Não existe passagem de parâmetros por referência em return a; C. Porém, podemos mudar indiretamente o valor de um } parâmetro real se usarmos ponteiros (próxima aula) 11 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: vetor como parâmetro • O vetor vet abaixo: int vet[10]; • Pode ser escrito com parâmetro de uma função de três maneiras: int soma(int vet[10]); int soma(int vet[]); int soma(int *vet[]); // veremos como esse protótipo funciona na próxima aula As três maneiras são equivalentes • O que é passado para a função, é o endereço da primeira posição do vetor – Logo, o conteúdo de cada posição do vetor pode ser alterado Ex: 12 (com constante) #define N 10 void zera(int vet[]){ int i; for(i=0; i<N; i++) vet[i]=0; } Aula 8 – Função, Constante e Macro (com dois parâmetros) void zera(int vet[], int n){ int i; for(i=0; i<n; i++) vet[i]=0; } Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: escopo de variáveis • Escopo de uma variável – Indica a. . . • durabilidade: a variável existe enquanto o bloco onde foi declarada existir • visibilidade: a variável só é visível ao bloco onde ela foi declarada – Tipos de escopo: • Variáveis locais – declaradas no início de um bloco – Ex: x, condicao, i • Parâmetros formais – declaradas como parâmetro de uma função – Ex: entrada • Variáveis globais – declaradas no início do programa, fora do main() – Ex: contador #include <stdio. h> int contador; int f(int entrada) { /* corpo da função */ } main(){ char condicao; int i; for (i=0; i<100; i=i+1) { float x=0; f(i); x = x + 1; printf(“%f”, x); } } Obs. : Uma variável é sempre recriada quando seu bloco é iniciado. Ex: o que será impresso em printf(“%d”, x)? 13 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021 teste. c
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: escopo de variáveis • Escopo de uma variável 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 14 teste 2. c - #include <stdio. h> - int contador=0; - int sucessor(int entrada) { entrada = entrada + 1; contador++; return entrada; -} - main(){ char condicao=‘A’; int i, j=0; for (i=0; i<3; i++) { int j=2; j++; sucessor(i); printf(“%d”, i); } j+=2; contador++; -} Aula 8 – Função, Constante e Macro Responda: a) Qual o escopo de j em (10) e (12)? b) Qual o valor de j depois de executar (17)? c) Qual o escopo de contador? Qual será seu valor na instrução (19)? d) Qual o escopo de condicao (9)? e) Qual o escopo de entrada (3)? Qual será seu valor se acessado na linha (12)? f) Que valor será impresso em (15)? Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função: modificador de escopo • static – Modifica a durabilidade (variável local) ou a visibilidade (variável glocal) de uma variável – Para uma variável de escopo: • local: seu valor não é perdido no final do bloco – Ex: saida – Mas lembre-se: » saida não é acessível fora de seu bloco • global: só é visível dentro do arquivo ao qual foi declarada – Ex: j mat. h static float j=2; 15 Aula 8 – Função, Constante e Macro #include <stdio. h> int sucessor() { static int saida = 0; saida = saida + 1; return saida; } main(){ printf(“%d”, sucessor()); // impresso 1 ou 2? } Teste. c #include <stdio. h> #include “mat. h” int main (){ printf (“%f”, j); //erro, pois j não é visível } Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (1) Função • Auto-avaliação – Diga o que se pede: #include <stdio. h> #include <conio. h> int num; int func(int a, int b){ a = (a+b)/2; /* Qual e o valor de a apos a atribuicao? */ num -= a; printf("nn. Confira! (durante) num = %dta = %dtb =%d", num, a, b); return a; } main(){ int first = 0, sec = 50; num = 10; printf("nn. Confira (antes)! num = %dtfirst = %dtsec =%d", num, first, sec); num += func(first, sec); /* Qual e o valor de num, first e sec */ /* antes e depois da atribuicao? */ printf("nn. Confira! (depois) num = %dtfirst = %dtsec =%d", num, first, sec); getch(); } 16 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (2) Constante • Sintaxe: #define NOME VALOR • Ex 1: #include <stdio. h> #define N 3 int main (){ printf ("Minha constante N vale %d", N); } Pré-compilador #include <stdio. h> int main (){ printf ("Minha constante N vale %d", 3); } Saída do programa Minha constante N vale 2 17 Aula 8 – Função, Constante e Macro Cuidado: não deve-se colocar ‘; ’ em uma diretiva #define • Ex 2: #include <stdio. h> #define N 3; int main (){ printf ("Minha constante N vale %d", N); } Pré-compilador #include <stdio. h> int main (){ printf ("Minha constante N vale %d", 3; ); } Erro de sintaxe Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (2) Constante • Ex 3: #include <stdio. h> #include <conio. h> #define N 2 int main (){ int i; printf ("N vale %dn", N); for (i=0; i<N; i++){ #define N 10 printf("N vale %dn", N); } printf ("Minha constante N vale : %dn", N); getch(); } N vale 2 N vale 10 Cuidado: as regras de escopo para variáveis não se aplicam a constantes. Veja o resultado desse programa em sua tela 18 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (3) Macro • Definição – É um identificador, que possui usualmente uma sequência de símbolos associada, denominada corpo da macro • Sintaxe #define NOME_DA_MACRO CORPO_DA_MACRO • Ex: #define PI 3. 14 Uma constante em C é uma Macro sem argumentos 19 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (3) Macro: com argumentos • Macro com argumentos – Parecido com uma função que recebe parâmetros • Sintaxe #define NOME_DA_MACRO(PAR 1, PAR 2, . . , PARN) CORPO_DA_MACRO • Ex 1: #include <stdio. h> #define DIVIDE(A, B) ((A)/(B)) expansão da macro main(){ printf(“%d”, DIVIDE(8, 2)); } #include <stdio. h> main(){ printf(“%d”, ((8)/(2)) ); } Expanda as macros abaixo, e veja seu resultado: DIVIDE(1. 4, 2) DIVIDE(3+1, 1+1) 20 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (3) Macro: com argumentos • Macro com argumentos – Parecido com uma função que recebe parâmetros • Sintaxe #define NOME_DA_MACRO(PAR 1, PAR 2, . . , PARN) CORPO_DA_MACRO • Ex 1: #include <stdio. h> #define DIVIDE(A, B) ((A)/(B)) expansão da macro main(){ printf(“%d”, DIVIDE(8, 2)); } #include <stdio. h> main(){ printf(“%d”, ((8)/(2)) ); } Expanda as macros abaixo, e veja seu resultado: DIVIDE(1. 4, 2) 0. 7 DIVIDE(3+1, 1+1) 2 21 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (3) Macro: com argumentos • Pra que usar tantos parênteses? É realmente necessário? • Ex 1: Retirei os parênteses dos argumentos A e B #include <stdio. h> #define DIVIDE(A, B) (A/B) main(){ printf(“%d”, DIVIDE(3+1, 1+1)); } • Ex 2: #include <stdio. h> #define DIVIDE(A, B) (A/B) main(){ printf(“%d”, DIVIDE(3+1, 1+1)); } 22 Aula 8 – Função, Constante e Macro expansão da macro #include <stdio. h> main(){ printf(“%d”, (3+1/1+1) ); } O valor esperado era 2, mas. . . Macro escrita em mais de uma linha Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (3) Macro: comparação com função MACRO #define MACRO(A, B, C) A+B+C main(){ MACRO(1, 2, 4); MACRO(3. 4, 5, ’c’); MACRO(6, 10, 3); } MACRO FUNÇÃO int funcao(int a, int b, int c){ return a + b + c; } main(){ funcao(1, 2, 4); funcao(3. 4, 5, ’c’); funcao(6, 10, 3); } FUNÇÃO Execução mais rápida, pois não há empilhamento de parâmetros Compilação mais rápida, pois não apenas um corpo da função é compilado Não verifica tipos Mais fácil de depurar Podem ser recursivas Possuem endereço 23 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
DHD – Desenvolvimento em Hardware Prof. Frederico Brito Fernandes (3) Macro • Auto-avaliação – Faça um programa que define: • Uma constante PI com o valor 3. 1416 • Uma macro que recebe o raio do círculo e calcula sua área 24 Aula 8 – Função, Constante e Macro Tuesday, September 7, 2021
- Slides: 24