Upload
others
View
27
Download
1
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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}
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
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)
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
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
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
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
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
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
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