Curso C: Funções e Macros



Documentos relacionados
Linguagem de Programação C

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Material preparado pela profa Silvana Maria Affonso de Lara

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Curso C: Controle de Fluxo

Curso C: Ponteiros e Arrays

Tabela ASCII de caracteres de controle

Analise o código abaixo:

1. Fazer um programa em C que pergunta um valor em metros e imprime o correspondente em decímetros, centímetros e milímetros.

Linguagem de Programação C

INTRODUÇÃO À LINGUAGEM C++

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Unidade IV: Ponteiros, Referências e Arrays

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Estruturas de Dados. Alguns dados não costumam ser tão simples assim... Podem ser compostos por vários dados distintos

Linguagem de Programação I

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Algoritmos e Programação

Listas (Parte 2) Túlio Toffolo BCC202 Aula 10 Algoritmos e Estruturas de Dados I

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

cast poderia ser usado também para transformar um real (float) em inteiro. A sintaxe C (float)i pode ser substituída em C++ por float(i).

LINGUAGEM C. Estrutura básica de um programa

Estruturas de repetição (Ciclos)

Introdução a POO. Introdução a Linguagem C++ e POO

INF 1007 Programação II

Estrutura de Dados Básica

INF 1005 Programação I

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

Introdução a Computação

Programação: Estruturas de seleção

ATENÇÃO!!! Rui Morgado - TLP 2

Estruturas de Dados Aula 15: Árvores 17/05/2011

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Capítulo 2: Introdução à Linguagem C

PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C

Programação de Computadores I. Ponteiros

Métodos Computacionais. Fila

A Pilha. Aula 02. DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria

Estrutura de Dados. Prof. Gustavo Willam Pereira. Créditos: Profa. Juliana Pinheiro Campos

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

insfcanceof new public switch transient while byte continue extends for int null

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

17 - Funções e Procedimentos em C Programação Modular

5 Apresentando a linguagem C

INF 1005 Programação I

Variáveis e Comandos de Atribuição

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

Computação II Orientação a Objetos

Trabalho 3: Agenda de Tarefas

Conceitos básicos da linguagem C

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Elementos de programação em C

Estruturas (Registros)

Java Como Programar, 8/E

9.1.2 Laços Controlados por Entrada: Contador

Programação Estruturada I

Programação. MEAer. Bertinho Andrade da Costa. Instituto Superior Técnico. Introdução ao Pré-Processador. 2011/2012 1º Semestre

Exemplos. char c; int i=67;... c= A ; c=c+1; if (c== B )... c=i; i=c; i++; if (i>= C )...

#define SIM 1 equivale a definição de constantes; a palavra SIM é substituída por 1 toda vez que é utilizada no programa.

P r o g r a m a ç ã o d e C o m p u t a d o r e s 1 o S e m P r o f. A n d r é A m a r a n t e L u i z L A B 5 tag %2d while printf PE1:

Linguagem C. TGSI Lógica de Programação / Linguagem C Prof. Marcos Roberto

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

Programa ConsoleRPN. PUC-Rio CIV Sistemas Gráficos para Engenharia Luiz Fernando Martha & André Maués Brabo Pereira

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 6 Filas

Algoritmos e Programa o Departamento de Inform tica

Programação por Objectos. Java

Conversão de Tipos e Arrays

Desenvolvimento OO com Java Orientação a objetos básica

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

14.1 Vetor - Problemas

DAS5102 Fundamentos da Estrutura da Informação

INF 1005 Programação I lista 12

Capítulo 8. CICLOS. Tabela 8.1 Programa8a.f90.

Linguagens de Programação I

Estruturas de Controle em PHP

2ª Lista de Exercícios

BC0505 Processamento da Informação

2 a LISTA DE EXERCÍCIOS DE LINGUAGEM C

Programando em C++ Histórico da Linguagem C

Estrutura switch if-else switch switch switch if-else-if switch switch case default break switch switch break Observações: case

INF 1620 P1-10/04/02 Questão 1 Nome:

Orientação a Objetos. Conceitos Iniciais Introdução a Linguagem Java. Gil Eduardo de Andrade

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Convertendo Algoritmos para a Linguagem C

Plano de Aula. if(condição) { bloco de comandos; } else { bloco de comandos2; }

Tipo Abstrato de Dados

3. INTRODUÇÃO À LINGUAGEM C 3.1. CONCEITOS BÁSICOS. Lógica de Programação

Pilhas. Profa Morganna Diniz

Transcrição:

Universidade de Brasília Departamento de Ciência da Computação Curso C: Funções e Macros Prof. Ricardo Pezzuol Jacobi rjacobi@cic.unb.br Funções Fun es s o blocos de c digo que podem ser nomeados e chamados de dentro de um programa Estrutura: valor_retornado nome_função ( parâmetros ) { declarações comandos 1

Funções uma fun o pode retornar qualquer valor v lido em C, sejam de tipos prž-definidos ( int, char, float) ou de tipos definidos pelo usu rio ( struct, typedef ) uma fun o que n o retorna nada Ž definida colocando-se o tipo void como valor retornado (= procedure) Pode-se colocar void entre par nteses se a fun o n o recebe nenhum par metro Declaração de Funções Fun es devem ser definidas ou declaradas antes de serem utilizadas A declara o apenas indica a assinatura ou prot tipo da fun o: valor_retornado nome_função(declaração_parâmetros); Menor fun o poss vel: void faz_nada( void ) { 2

Passagem de Parâmetros em C os argumentos para uma fun o s o sempre passados por valor (by value), ou seja, uma c pia do argumento Ž feita e passada para a fun o void loop_count( int i ) { printf( "Em loop_count, i = " ); while( i < 10 ) printf ( "%d ", i++); ==> i = 2 3 4 5 6 7 8 9 void main( ) { int i = 2; loop_count( i ); printf( "\nem main, i = %d.\n", i ); ==> i = 2. Passagem de Parâmetros como, ent o, mudar o valor de uma vari vel? passagem de parâmetro por referência enviar o endere o do argumento para a fun o 3

Passagem de Parâmetros Passagem por valor Passagem por referência arg func_call (arg) Cópia de arg enviado para a função arg func_call (* arg) Endereço de arg enviado para a função def_função (arg) arg def_função (* arg) (* arg) Passagem de Parâmetros Passagem por refer ncia: void loop_count( int *i ) { printf( "Em loop_count, i = " ); while( i < 10 ) printf ( "%d ", (*i)++); ==> i = 2 3 4 5 6 7 8 9 void main( ) { int i = 2; loop_count( &i ); printf( "\nem main, i = %d.\n", i ); ==> i = 10. 4

Prática: função troca Fazer uma fun o troca(px, py) que recebe como par metros 2 ponteiros para inteiros e troca o conteœdo deles ex: int x = 10, y = 20; troca(&x, &y); printf(òx=%d y=%dó, x, y) => x=20 y=10 Prática: função troca void troca (int *px, int *py) { int temp; temp=*px; *px=*py; *py=temp; px: py: x: y: 5

Retornando Valores uma fun o retorna um valor atravžs do comando return Ex: int power (int base, int n) { int i,p; p = 1; for (i = 1; i <= n; ++i) p *= base; return p; Funções o valor retornado por uma fun o Ž sempre copiado para o contexto de chamada (retorno by value) x = power(2, 5); /* atribuição */ if (power(7, 2) > 12543) /* comparação */ printf( Numero grande! ); x = 10*power(2,3); /* expressão */ array[get_index()]; /* índice */ funcao( get_arg() ); /* argumento */ 6

Ex: Concatena Strings char *concatena( char cabeca[], char cauda[] ) { int i, j; for (i = 0; cabeca[i]!= '\0'; i++); for (j = 0; (cabeca[i] = cauda[j])!= '\0'; i++, j++); cabeca[i] = '\0'; return cabeca; Exemplo (cont.) int main( ) { char nome[80] = "Santos"; char sobrenome[] = " Dumont"; printf( "O nome é %s.\n", concatena( nome, sobrenome ) ); return 0; ==> Santos Dumont 7

Prática: Localiza char em string Fazer uma fun o que procura um caracter em um string e retorna o seu endere o caso o encontre, sen o retorna NULL (ponteiro nulo) Ex: char *achachar (char *str, char c) {... char str[] = abcd5678 ; achachar(str, c ); ==> retorna ende o do terceiro caracter do string: &str[2] Achachar char *achachar (char *str, char c) { char *pc = str; while (*pc!= c && *pc!= '\0') pc++; return *pc? pc : NULL; 8

Exemplo: Pilha Um pilha Ž definida como uma estrutura onde os dados s o inseridos em uma ordem e retirados em ordem inversa. Opera es b sicas: push(a) pop() A topo() B T vazia() T cheia() A B C D B C D B C D A B C D Pilha com Array Uma pilha pode ser implementada como um array onde o topo Ž indicado com um ndice index tipo pilha[maxpil]; C D pilha[3] pilha[2] pilha[1] pilha[0] Topo(): index aponta para a posição vazia: retorna pilha[index-1]; Vazia: retorna index == 0 Push(d): pilha[index] = d; incrementa index; Pop(): decrementa index; retorna pilha[index]; Cheia(): returna index == MAXPIL+1 9

Pilha de Inteiros em C #define MAXPIL 10 int pilha[maxpil]; int index = 0; void push(int dado) { pilha[index++] = dado; int pop() { return pilha[--index]; int topo() { return pilha[index-1]; int vazia() { return (index == 0); int cheia() { return (index == MAXPIL+1; Número de Parâmetros Variável C permite declarar fun es com nœmero vari vel de argumentos atravžs da inser o de retic ncias Ò...Ó função ( arg1, arg2,... ); Como determinar o nœmero de par metros passados: Ð string de formato, como no comando printf: Ex: printf ( %s %d %f\n, s, i, f); Ð pela especifica o do nœmero de par metros Ex: soma (3, 10, -1, 5); Ð pela inclus o de um valor de termina o Ex: media ( 1, 4, 6, 0, 3, -1 ); 10

Acesso aos Parâmetros C oferece uma sžrie de macros para acessar uma lista de argumentos: va_list: Ž um tipo prž-definido utilizado para declarar um ponteiro para os argumentos da lista va_start(va_list ap, ultimo_arg_def ): inicia o ponteiro ap fazendo-o apontar para o primeiro argumento da lista, ou seja, o primeiro argumento depois de ultimo_arg_def. Ð ultimo_arg_def Ž o nome o œltimo argumento especificado no declara o da fun o Acesso aos Parâmetros type va_arg( va_list ap, type ): retorna o valor do argumento apontado por ap e faz ap apontar para o pr ximo argumento da lista. Type indica o tipo de argumento lido (int, float, etc.) void va_end ( va_list ap ) : encerra o acesso ˆ lista de par metros. Deve sempre ser chamada no final da fun o 11

Exemplo Parâmetros Variáveis #include <stdio.h> sum( 5, 3, 5, 18, 57, 66 ) ==> 149 #include <stdlib.h> sum( 2, 3, 5 ) ==> 8 #include <stdarg.h> int sum( int no_args,... ) { va_list ap; int result = 0, i; va_start( ap, no_args ); for( i = 1; i <= no_args; i++ ) { result += va_arg( ap, int ); va_end(ap); return result; Parâmetros para main() ao executar programas a partir de linha de comando, Ž poss vel passar par metros diretamente para a fun o main() os argumentos s o fornecidos na forma de um array de strings. main() Ž definida com dois par metros: main ( int argc, char *argv[] ) argc é o número de argumentos argv é o array de argumentos 12

Parâmetros para main() por conven o, o primeiro argumento argv[0] Ž o nome do programa e o œltimo Ž 0 (zero) ex: echo Al, mam e argc = 3 argv echo\0 Alô, \0 mamãe\0 0 Parâmetros para main() Uma poss vel implementa o para echo: #include <stdio.h> void main( int argc, char *argv[] ) { int i; for ( i = 1; i < argc; i++ ) printf( %s%s, argv[i], (i < argc-1)? : ); printf( \n ); 13

Recursão em C uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Ex: cálculo do fatorial de um número: n! = n * (n - 1)! Exemplo Fatorial #include <stdio.h> int fatorial (int n) { if (n == 0) /* condição de parada da recursão */ return 1; else if (n < 0) { printf ("Erro: fatorial de número negativo!\n"); exit(0); return n*fatorial(n-1); 14

Exemplo Fatorial fatorial(5) => (5 0) return 5 fatorial(4) => (4 0) return 4 fatorial(3) => (3 0) return 3 fatorial(2) => (2 0) return 2 fatorial(1) => (1 0) return 1 fatorial(0) => (0 == 0) <= return 1 <= return 1 1 (1) <= return 2 1 (2) <= return 3 2 (6) <= return 4 6 (24) <= return 5 24 (120) 120 Estrutura de uma Recursão uma recurs o obedece a uma estrutura que deve conter os seguintes elementos: fun o (par) Ð teste de tžrmino de recurs o utilizando par se teste ok, retorna aqui Ð processamento aqui a fun o processa as informa es em par Ð chamada recursiva em parõ par deve ser modificado de forma que a recurs o chegue a um tžrmino 15

Exemplo: printd(int) printd(int) imprime um inteiro usando recurs o void printd (int n) { if (n < 0) { /* imprime sinal */ putchar('-'); n = -n; if (n / 10) /* termino recursao */ printd(n/10); /* recursao se n>10 */ putchar(n % 10 + '0'); /* senao imprime char */ Exemplo printd() printd(-1974) ==> (n < 0) --> putchar(ô-õ) - ==>printd(197) - ==> printd(19) - ==> printd(1) - (1 / 10 == 0) - putchar(1 + Ô0Õ) -1 putchar(19%10 + Ô0Õ) -19 putchar(197%10 + Ô0Õ) -197 putchar(1974 %10 + Ô0Õ) -1974 16

Exemplo: quicksort quicksort é um exemplo de algoritmo recursivo para ordenar elementos em um array baseia-se em um processo de divisão e conquista: divisão: o array A[ n] é dividido em dois subarrays A 0 e A 1 de forma que para qualquer elemento A 0 [i], A 1 [j] temos: A 0 [i] A 1 [j] conquista: A 0 e A 1 são recursivamente ordenados Quicksort void quicksort (int *A, int inicio, int fim) { int meio; if (inicio < fim) { meio = parte(a, inicio, fim); quicksort(a, inicio, meio); quicksort(a, meio+1, fim); 17

Quicksort void troca (int *A, int a, int b) { int tmp; tmp = A[a]; A[a] = A[b]; A[b] = tmp; int parte (int *A, int inicio, int fim) { int x = A[inicio]; int i = inicio - 1; int f = fim + 1; while (TRUE) { do --f; while (A[f] > x); do ++i; while (A[i] < x); if (i < f) troca(a, i, f); else returnf; Prática 1. Escrever uma fun o recursiva que retorna o tamanho de um string, rstrlen(char s[]) 2. Fazer uma fun o recursiva que conta o nœmero de ocorr ncias de um determinado caracter, caract(char c, char s[]) 3. Escreva uma fun o recursiva que produza o reverso de um string, reverse(char s[]) 18

Macros defini o de uma macro #define nome_macro texto_equivalente a defini o da macro vai atž o fim da linha o caracter Ò\Ó permite continuar a defini o da macro em outras linhas: #define nome_macro texto_1 \ texto_2 \... /*até encontrar uma linha sem \ */ Macros alžm de tornar o c digo mais leg vel, macros podem aumentar a velocidade de execu o: #define TAXA 0.3... imposto = preco * TAXA; Ž mais eficiente que: float taxa = 0.3;... imposto = preco * taxa; pois o programa n o precisa ler taxa da mem ria 19

Macros #include <stdio.h> #include <stdlib.h> Oi, este e um exemplo de macro #define FIRST_CHAR 'O' #define SECOND_CHAR 'i' #define COMMA ',' #define STRING " este e um exemplo de macro." void main() { putchar( FIRST_CHAR ); putchar( SECOND_CHAR ); putchar( COMMA ); puts( STRING ); Macros aten o as aspas: #define STRING Uma sequencia de caracteres.... printf( %s, STRING ); ==>? STRING 20

Aninhamento de Macros #define NUM_1 10 #define NUM_2 5 #define SOMA NUM_1 + NUM_2... printf ( Resultado soma : %d, SOMA); primeiro passo do prž-processador: printf ( Resultado soma : %d, NUM_1 + NUM_2); segundo passo do prž-processador: printf ( Resultado soma : %d, 10 + 5); Macros em Formato de Função #define nome(lista_parâmetros) texto Ex: #define MILES2KM(m) m*(8.0/5.0)... double milhas, kilometros; milhas = 62.0; kilometros = MILES2KM(milhas); -- após expansão da macro: kilometros = milhas*(8.0/5.0); 21

Macros em Formato de Função macros podem ter v rios par metros separados por v rgulas: #define SOMA(a, b) a + b... int i=10, j=20, k; float f=5.5, g=2.3, h; k = SOMA(i, j); h = SOMA(f, g); Prática Implemente a macro soma, testando a sua aplica o em dados tipo inteiro e float 22