linguagem c 04 - facomlinguagem c linguagem c –0044:: macros, funÇÕes e cláudio c. rodrigues...

18
LINGUAGEM C LINGUAGEM C – 04 04: MACROS, FUNÇÕES E MACROS, FUNÇÕES E Cláudio C. Rodrigues Faculdade da Computação - UFU MACROS, FUNÇÕES E MACROS, FUNÇÕES E PROCEDIMENTOS PROCEDIMENTOS 1 Objetivo Objetivo Introduzir o conceito de pré- processamento e apresentar as duas principais diretivas utilizadas. Mostrar a criação e o uso de funções em C. Faculdade da Computação - UFU 2

Upload: others

Post on 30-Jun-2020

30 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

LINGUAGEM C LINGUAGEM C –– 0404::MACROS, FUNÇÕES E MACROS, FUNÇÕES E

Cláudio C. RodriguesFaculdade da Computação - UFU

MACROS, FUNÇÕES E MACROS, FUNÇÕES E PROCEDIMENTOSPROCEDIMENTOS

1

ObjetivoObjetivo

� Introduzir o conceito de pré-

processamento e apresentar as duas

principais diretivas utilizadas.

�Mostrar a criação e o uso de funções�Mostrar a criação e o uso de funções

em C.

Faculdade da Computação - UFU 2

Page 2: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Macros & FunçõesMacros & Funções

� Pré-processamento

◦ A diretiva #define

◦ A diretiva #include

� Definição e Uso de Funções

◦ Funções que não devolvem Resposta◦ Funções que não devolvem Resposta

◦ Funções que devolvem Resposta

� Classes de Armazenamento

� Recursividade

◦ Funções Recursivas

◦ Procedimentos Recursivos

Faculdade da Computação - UFU 3

PréPré--processamentoprocessamento

� Todo programa C, antes de chegar ao compilador é tratado por um módulo adicional denominado pré-processador.

� O pré-processador realiza uma série de modificações no código-fonte, antes que ele seja analisado pelo compilador.seja analisado pelo compilador.

� Essas modificações são especificadas através de diretivas de pré-processamento embutidas no código-fonte do programa.

� As principais diretivas são:

◦ #include e #define

Faculdade da Computação - UFU 4

Page 3: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

PréPré--processamentoprocessamento

*.lib.h

Faculdade da Computação - UFU 5

O processo de geração de um executável

.c .obj

.exePré-processador compilador linkeditor

Diretiva Diretiva #include#include

� Diretiva #include diz ao compilador para incluir na compilação do

programa o arquivo especificado.

� Geralmente estes arquivos contem � Geralmente estes arquivos contem

bibliotecas de funções ou rotinas do usuário.

� Exemplo:

◦ #include <stdlib.h>

◦ #include “myfile.h”

Faculdade da Computação - UFU 6

Page 4: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Diretiva Diretiva #define#define

� A diretiva #define serve para definir constantes simbólicas que aumentam a

legibilidade do código-fonte.

� Sintaxe:

◦ #define identificador texto◦ #define identificador texto

� Exemplo:

◦ #define escreve printf

◦ #define quadrado(n) ((n)*(n))

Faculdade da Computação - UFU 7

1. Macros1. Macros

� Com a diretiva #define podemos realizar substituições parametrizadas, que chamamos macros:

◦ #define quad(n) ( (n)∗(n) )

◦ #define abs(n) ( (n)<0 ? −(n) : (n) )◦ #define abs(n) ( (n)<0 ? −(n) : (n) )

◦ #define max(x,y) ( (x)>(y) ? (x) : (y) )

� Podemos criar um arquivo contendo as macros e, através da diretiva #include, vinculá-las a um programa.

◦ #include “macros.h”

Faculdade da Computação - UFU 8

Page 5: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Desafio de ProgramaçãoDesafio de Programação

� Defina as macros descritas a seguir:

A. eh_minuscula(c): informa se a letra c é uma letra minúscula.

B. eh_maiuscula(c): informa se a letra c é uma letra maiúscula.

C. minuscula(c): converte a letra c para minúscula.

D. maiuscula(c): converte a letra c para maiúscula.

Faculdade da Computação - UFU 9

22. Funções. Funções

� Terminologia:

◦ Um programa consiste de subpartes.

◦ Em C, essas subpartes são chamadas funções.funções

◦ Os termos subrotinas, procedimentos, subprogramas, significam

essencialmente a mesma coisa que

função.

◦ Uma função pode retornar um valor ou não.

Faculdade da Computação - UFU 10

Page 6: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

2. Funções2. Funções

� Uso:

◦ Reaproveitamento de código.

◦ Evitar que um trecho do código seja repetido várias vezes.

◦ Facilitar a manutenção do código.

◦ Facilitar a leitura do código.

◦ Separar o programa em partes que possam ser logicamente compreendidas

de forma isolada.

Faculdade da Computação - UFU 11

22. Funções Pré. Funções Pré--definidasdefinidas

� Até agora, nos programas que criamos, codificamos uma única função main(). Entretanto, algumas funções de biblioteca foram utilizadas, tais como:

◦ printf(), scanf(), getchar(), putchar(), etc.◦ printf(), scanf(), getchar(), putchar(), etc.

� Essas funções estão disponíveis no sistema através de bibliotecas que acompanham o compilador, mas podemos definir nossas próprias funções.

Faculdade da Computação - UFU 12

Page 7: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

2. Funções2. Funções

� Em C, uma função pode retornar um valor (produzir um valor) ou pode

executar alguma ação sem retornar

um valor.um valor.

� Para que uma função seja

reconhecida durante a compilação

devemos declará-la e definí-la antes

de qualquer referência (invocação).

Faculdade da Computação - UFU 13

DefiniçãoDefinição

void print_stars();

void main(){

#include <stdio.h>Includes libraries

Declaração (protótipo)

Via compilation

14

{int x, y;scanf(“%d%d”, &x, &y);print_stars();printf(“%d”, x+y);print_stars();

}

void print_stars(){

int i;for(i=0; i<5; i++)

printf(“*”); printf(“\n”);

}

Função Main

Definição (implementação)

compilation time

Via linking time

Page 8: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

FunçõesFunções

� Declaração:

◦ A declaração de uma função, conhecida como assinatura ou protótipo, consiste em seu tipo_retorno, nome e lista de

parâmetros seguida de ponto-e-vírgula.parâmetros seguida de ponto-e-vírgula.

◦ Quando a função não retorna um valor o tipo_retorno é declarado como sendo

void.

Faculdade da Computação - UFU 15

Funções: DefiniçãoFunções: Definição

tipo_retorno nome (parâmetros) {

declarações;

comandos;

}

� Onde:

◦ tipo_retorno refere-se ao tipo de resposta que a função devolve e;

◦ nome é o identificador da função ◦ parâmetros é uma lista de variáveis que representam valores de entrada para a função

◦ No corpo da função, a primeira seção é destinada à declaração das variáveis e a segunda, aos comandos.

Faculdade da Computação - UFU 16

Page 9: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Funções: DefiniçãoFunções: Definição

tipo_retorno nome (parâmetros) {

declarações;

comandos;

}

� O fluxo de execução retorna de uma função ao módulo que a chamou de duas maneiras: retorno natural ou retorno explícito.

� No retorno natural, isso ocorre após a execução do último comando do corpo da função.

� No retorno explícito, isso ocorre através do comando return.

Faculdade da Computação - UFU 17

InvocaçãoInvocação� Para chamarmos uma função precisamos invocar seu nome(), conforme protótipo.

� Exemplo:

18

void main(){

func1();

func2();

func1();}

func1(){

perform a task}

func2(){

perform a task}

Page 10: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Funções: ExemploFunções: Exemplo

#include <stdlib.h>

int media(int a,int b); /* protótipo */

int max(int a, int b); /* protótipo */

int main()

{

int x, y, med;

printf(“Digite dois valores:”);

int media(int a, int b)

{

return ((a+b)/2);

}

int max(int a, int b)

{

return (a>b ? a : b);printf(“Digite dois valores:”);

scanf(“%d %d”,&x,&y);

med = media(x,y);

printf(“A média de %d e %d eh %d.\n”,x,y,med);

printf("O maior de %d e %d eh %d.\n",x,y,max(x,y));

return 0;

}

return (a>b ? a : b);

}

Faculdade da Computação - UFU 19

Desafios de ProgramaçãoDesafios de Programação

A. Codifique uma função que receba um número real n e devolva sua raiz quadrada r. Para calcular r, use o método proposto por Newton:

1. chuta-se um valor inicial para a raiz igual a 1;

2. Caso |r2-n| seja inferior a 0.001, r é a resposta (fim);

3. Caso contrário, aproxima-se r=(r2+n)/(2r) e retorna-se ao passo 2.

A. Codifique a função fat(n) , que devolve o fatorial de n

Faculdade da Computação - UFU 20

Page 11: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

FunçõesFunções

� Passagem de Parâmetros:

◦ Passagem de parâmetros por valor

� Significa que, para a execução da função,

serão geradas cópias dos valores de cada um

dos parâmetros.dos parâmetros.

◦ Passagem de parâmetros por referência

� Significa que os parâmetros passados para

uma função correspondem a endereços de

memória alocados as variáveis.

Faculdade da Computação - UFU 21

Parâmetros Parâmetros

void print_stars(int num, char sign);

int main(){

int x, y;

#include <stdio.h>Includes libraries

Declaração (prototipo)

22

{int x, y;scanf(“%d%d”, &x, &y);print_stars(6, ’$’);printf(“%d”, x+y);print_stars(5, ’*’);return 0;

}

void print_stars(int num, char sign){

int i;for(i=0; i<num; i++)

printf(“%c”, sign); printf(“\n”);

}

Função main

num=6sign=‘$’

Definição (implementação)

Page 12: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Exemplos:Exemplos:

Passando parâmetrosPassando parâmetros#include <stdlib.h>

int fatorial(int n);

int main()

{

int n;

printf(“Digite um valor:”);

scanf(“%d”,&n);

printf(“O fatorial de %d eh %d.\n”,n,fatorial(n));

#include <stdlib.h>

void swap(int *a,int *b);

int main()

{

int a,b;

printf(“Digite dois valores:”);

scanf(“%d %d”,&a,&b);

printf(“a=%d eh b=%d \n”,a,b);

swap(&a,&b);%d.\n”,n,fatorial(n));

return 0;

}

int fatorial(int n)

{

int i, fat=1;

if(n<1) return 1;

for(i=1;i<=n;i++) fat *= i;

return fat;

}

swap(&a,&b);

printf(“a=%d eh b=%d \n”,a,b);

return 0;

}

void swap(int *a,int *b)

{

int temp;

temp = *b;

*b = *a;

*a = temp;

}

Faculdade da Computação - UFU 23

Função main():Função main():

Passando ParâmetrosPassando Parâmetros� Algumas vezes é útil passar informações a um programa quando ele é executado. Isto é, na linha de comandos.

� Em C, há dois argumentos internos especiais para receber estes especiais para receber estes parâmetros da linha de comandos:◦ argc e argv

� Sintaxe:◦ int main(int argc, char* argv[])◦ argc� indica o número de argumentos

◦ argv[] � guarda os argumentos

Faculdade da Computação - UFU 24

Page 13: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Exemplo:Exemplo:

Parâmetros na main()Parâmetros na main()#include <stdlib.h>

int main(int argc, char* argv[])

{

if(argc != 2) {if(argc != 2) {

printf(“Usage: Iam name\n”);

exit(1);

}

printf(“Hello %s!\n”,argv[1]);

return 0;

}

Faculdade da Computação - UFU 25

3. Classes de Armazenamento3. Classes de Armazenamento

� A classe de armazenamento especifica dois atributos importantes de uma variável:

◦ quando ela será criada e destruída (duração) e

◦ em que parte do programa ela estará acessível (escopo)

� As principais classes de armazenamento são:

◦ Local ou Automática� declarada dentro de uma função e duração desta.� declarada dentro de uma função e duração desta.

◦ Global ou Externa� declarada fora de qualquer função. são criadas no início e existem durante a execução do programa.

◦ Estática� tem o escopo de uma local e a duração de uma global.

◦ Registrador� armazenada diretamente num registrador da CPU

Faculdade da Computação - UFU 26

Page 14: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

33.Classes de Armazenamento.Classes de Armazenamento

classe palavra escopo duração exemplo

local auto função função auto int n;

global extern programa programa extern int n;

estática static função programa static int n;

registrador register função função register int n;

Faculdade da Computação - UFU27

Exemplo:Exemplo:

#include <stdio.h>

int a = 33;

void sss() {

int b = 88;

printf("sss: a = %d, b = %d\n", a, b);

}}

int main() {

int a = 77, b = 55;

printf("main1: a = %d, b = %d\n", a, b);

sss();

printf("main2: a = %d, b = %d\n", a, b);

return 0;

}

Faculdade da Computação - UFU 28

Page 15: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Exemplo: Exemplo:

Uso de variável estáticaUso de variável estática#include <stdio.h>

#include <conio.h>

int aleat();

void main(void)

{

int aleat(void)

{

static unsigned s = 1234;

auto unsigned n = s%100;

s += s/10;

return n;

char c;

while( c=getch()!='q')

printf(“%d\n”, aleat() );

}

}

// uma variável estática é

// inicializada uma única vez,

// no momento em que é criada

Faculdade da Computação - UFU 29

4. 4. Variáveis IndexadasVariáveis Indexadas

� Em C, a passagem de uma variável indexada como argumento é sempre por referência.

� Assim, caso algum elemento indexado do parâmetro seja alterado, o elemento do argumento sofre a referida alteração.

� Outro ponto importante é que quando se deseja produzir uma variável indexada dentro da função e retorná-la ao módulo que a chamou, deve-se usar ponteiros.módulo que a chamou, deve-se usar ponteiros.

� Considere o exemplo:

int *NovoVetor(int B[]) {

int i, *C;

C = (int *) malloc(10*sizeof(int));

for (i = 0; i < 10; i++)

C[i] = B[i] + 4;

return C;

}

Faculdade da Computação - UFU 30

Page 16: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

55. Recursividade. Recursividade

� A recursividade é um princípio que nos permite obter a solução de um problema a partir da solução de uma instância menor de si mesmo.

� Para aplicar esse princípio devemos � Para aplicar esse princípio devemos supor que a solução da instância menor é conhecida

◦ A parte mais difícil de entender é como obtemos a solução para a instância menor.

Faculdade da Computação - UFU 31

55. Funções Recursivas. Funções Recursivas

� Ao definir uma função recursiva

devemos identificar:

◦ a base da recursão, i.e. a instância mais simples do problema em questão.

� A base trata o caso mais simples, para o qual

temos uma solução trivial.

◦ o passo da recursão, i.e. como simplificar o problema em questão.

� o passo trata os casos mais difíceis, que

requerem novas chamadas recursivas.

Faculdade da Computação - UFU 32

Page 17: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Exemplo:Exemplo:

Cálculo da PotênciaCálculo da Potência

p = pot(2,3)

{ 01

1

=−

nse

áriocaso_contrx.x

nnx

double pot(double x, unsigned n)

Faculdade da Computação - UFU 33

= 2 * pot(2,2)

= 2 *2 *pot(2,1)

= 2 *2 *2 *pot(2,0)

= 2 *2 *2 *1

= 8

{

if( n==0 ) return 1;

return x * pot(x,n-1);

}

Desafios de Programação:Desafios de Programação:

A. Defina uma função recursiva, faça a simulação por substituição e desenhe o fluxo de chamadas e retornos:1. Calcular o fatorial de um número natural.

2. Calcular o resto da divisão inteira usando subtração.subtração.

3. Calcular o quociente da divisão inteira usando subtração.

4. Calcular o produto de dois naturais usando adição.

5. bin(n), que exibe o número natural n em binário.

Faculdade da Computação - UFU 34

Page 18: Linguagem C 04 - FACOMLINGUAGEM C LINGUAGEM C –0044:: MACROS, FUNÇÕES E Cláudio C. Rodrigues ... para incluir na compilação do programa o arquivo especificado. ... J., Aprendendo

Bibliografia:Bibliografia:

� Pereira, S.L., Linguagem C – Distribuição gratuita.

� Schildt, H., C Completo e Total, Editora Makron Books do Brasil Editora Ltda, 1996.

� Evaristo, J., Aprendendo a programar programando em linguagem C, Book programando em linguagem C, Book Express, 2001.

� Mizrahi, V. V., Treinamento em Linguagem C, Curso Completo, Módulos 1 e 2, Makron Books do Brasil Editora Ltda,1990.

� Kernighan, B.W & Ritchie, D. M., C a Linguagem de Programação, Editora Campus, 1986.

Faculdade da Computação - UFU 35

Dúvidas?Dúvidas?

Faculdade da Computação - UFU 36