Estruturas Dinâmicas - Ponteiros Parte IV

Documentos relacionados
Estruturas Dinâmicas - Ponteiros Parte IV

Estruturas Dinâmicas - Ponteiros Parte I

Registros/Estruturas e Conjuntos

Parte I. Introdução à Ciência da Computação I Modularização de Programas. SSC ICC1 Teórica

Estruturas Dinâmicas - Ponteiros

Estrutura de Programas e Tipos de Dados Simples

Estruturas dinâmicas Ponteiros

Tipos de Dados Simples (Continuação)

Estrutura de Programas Repetição Parte III

Comandos de Repetição Parte II

Laboratório de Introdução à Ciência da Computação I

Laboratório de Introdução à Ciência da Computação I

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Funções. definição, declaração e chamada

Funções. definição, declaração e chamada

Programação Estruturada

Comandos de Decisão Parte I

ponteiros INF Programação I Prof. Roberto Azevedo

Vetores. Vetores. Vetores. Vetores. Vetores. Algoritmos e Lógica de Programação. Vetores

O vetor é provavelmente um dos mais simples e importantes tipos agregados. Através do seu uso, podemos

Funções em Linguagem C Parte II

Cadeias de Caracteres (Strings)

Caracteres. Caracteres são representados através de códigos numéricos. Tabela de códigos: Define correspondência entre caracteres e códigos numéricos

Introdução a Programação de Jogos

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Tipos de Dados Avançados Vetores e Matrizes

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Introdução à Programação

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Introdução a Computação

Programação de Computadores II. Cap. 7 Cadeias de Caracteres

Ponteiros e Tabelas. K&R: Capítulo 5

CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos:

Aula 1 Apresentação do Curso

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Linguagem C ponteiros

3. Linguagem de Programação C

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Estruturas de Dados. Profa. Juliana Pinheiro Campos

12 - Dados Estruturados Vetores, Matrizes e Strings

Algoritmos e Programação

Programação Estruturada

Referências. Linguagem C. Tipos de variáveis em XC8. Tipos de variáveis. Tipos de variáveis em XC 8 Exemplo. Radicais numéricos em C

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

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES. Linguagem C. Linguagem C Estrutura Básica. Constante (literais) Linguagem C Primeiro Programa

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Módulo 7 Cadeias de Caracteres

Apêndice B. Cadeias de Caracteres (Strings)

Linguagem C Princípios Básicos (parte 1)

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

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

Introdução a Programação. Strings (Vetor de Caracteres)

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

Introdução à Linguagem C

Linguagem de Programação. Thiago Leite Francisco Barretto

Strings. Introdução. Definição de strings. Criação/Declaração de strings. Inicialização de strings. Manipulação de strings. Exemplos.

Computação 2. Aula 7. Profª. Fabiany Ponteiros

MC-102 Aula 11 Strings

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

ECT1203 Linguagem de Programação

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Elementos de Linguagem C

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Introdução à Programação

Curso de Introdução à Liguagem de. Grupo PET-Tele. Universidade Federal Fluminense. July 16, 2012

Programação: Vetores

Caracteres e. cadeia de caracteres. IPC2 1999/2000 F. Nunes Ferreira

Ponteiros. prof. Fabrício Olivetti de França

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

Programação de Computadores II

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Universidade Estadual de Mato Grosso do Sul Ciência da Computação Algoritmos e Estruturas de Dados I (AED-I) Prof. Nilton

Linguagem de Programação I Vetores e Strings. Thiago Leite Francisco Barretto

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

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

Cláudio C. Rodrigues Faculdade da Computação - UFU. Faculdade da Computação - UFU 1

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Introdução à Linguagem C Variáveis e Expressões

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Programação de Computadores

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

A linguagem C (visão histórica)

Aula 9 Oficina de Programação Strings. Profa. Elaine Faria UFU

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Conhecendo a Linguagem de Programação C

Carlos Eduardo Batista. Centro de Informática - UFPB

Linguagem C Introdução. Contexto Histórico Principais diferenças do Java Funções em C Compilar programas em C no Linux

Tópicos em C. Eliade F. Lima

Computação 2. Aula 9. Diego Addan Arquivos

Fundamentos de Programação

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Transcrição:

SSC0101 - ICC1 Teórica Introdução à Ciência da Computação I Estruturas Dinâmicas - Ponteiros Parte IV Prof. Vanderlei Bonato: vbonato@icmc.usp.br Prof. Claudio Fabiano Motta Toledo: claudio@icmc.usp.br

Sumário Macros Exemplos Vetor de ponteiros para funções const & volatile 23/5/2011 2

Macro Substitui um identificador da macro por um texto substitutivo. #define max(a,b) ((A)>(B))? (A):(B)) Apesar de parecer uma função, o uso de max torna-se um código. Cada ocorrência de max é trocada pelo argumento real correspondente. x = max(p+q, r+s); x=((p+q)>(r+s)?(p+q):(r+s)); 23/5/2011 3

Cuidado com as armadilhas: #include <stdio.h> #include <stdlib.h> #include <conio.h> #define max(a,b) ((A)>(B)? (A):(B)) #define quad(x) X*X int main() int p=1,q=2,r=3,s=4, i=5, j=10, z=3; printf("\nmax=%d", max(p+q,r+s)); printf("\nmax=%d", max(i++, j++)); printf("\ni=%d j=%d",i,j); printf("\nquad=%d", quad(z+1)); return 0; max=7 max=11 i=6 j=12 quad=7 23/5/2011 4

Macro - Assert A macro assert() é utilizada para assegurar que o valor de uma expressão é o valor esperado. O arquivo de cabeçalho assert.h contém essa macro. Se o valor esperado não for retornado, o sistema irá imprimir uma mensagem e o programa será encerrado. 23/5/2011 5

#include <assert.h> #include <stdio.h> int f(int a, int b); int g(int c); int main(vod) int a, b, c;... scanf( %d%d, &a, &b); c=f(a,b); assert(c>0); b=g(c);... Macro - Assert 23/5/2011 6

Exemplo 1 Encontrar a raiz do polinômio x 5-7x-3.0 23/5/2011 7

main.c #include "find_root.h" int cnt=0; const dbl eps=1e-13; int main() dbl a = -10.0; dbl b = 10.0; dbl root; assert((f(a)*f(b)<=0.0)); root = bisection(f,a,b); printf("%s%d\n%s%.15f\n%s%.15f\n", "Num. de chamadas de fct: ",cnt, "Raiz aproximada: ", root, " Valor da funcao: ", f(root)); return 0; 23/5/2011 8

bisection.c #include "find_root.h" dbl bisection(dbl f(dbl x), dbl a, dbl b) dbl m = (a+b)/2.0; ++cnt; if(f(m)==0.0 b-a < eps) return m; else if (f(a)*f(m)<0.0) return bisection (f,a,m); else return bisection(f,m,b); Num. de chamadas fct: 49 Raiz aproximada: 1.719628091484431 Valor da função: - 0.000000000000979 find_root.h #include <assert.h> #include <stdio.h> typedef double dbl; extern int cnt; extern const dbl eps; dbl bisection(dbl f(dbl x), dbl a, dbl b); dbl f(dbl x); fct.c #include "find_root.h" dbl f(dbl x) return (x*x*x*x*x - 7.0*x - 3.0); 23/5/2011 9

Exemplo 2 Solucionando a equação de Kepler x - e*sin(x) m com m=2.2, e=0.5. #include <assert.h> kepler.h #include <math.h> #include <stdio.h> typedef double dbl; extern int cnt; extern const dbl eps; extern const dbl e; extern const dbl m; dbl bisection(dbl f(dbl x), dbl a, dbl b); dbl kepler(dbl x); kepler.c #include kepler.h" dbl kepler(dbl x) return (x- e*sin(x)-m); 23/5/2011 10

main.c #include kepler.h" int cnt=0; const dbl eps=1e-15; const dbl e=0.5; const dbl m=2.2; int main() dbl a = -100.0; dbl b = 100.0; dbl root; assert((kepler(a)*kepler(b)<=0.0)); root = bisection(kepler,a,b); printf("%s%d\n%s%.15f\n%s%.15f\n", "Num. de chamadas de fct: ",cnt, "Raiz aproximada: ", root, " Valor da funcao: ", f(root)); return 0; 23/5/2011 11

Vetor de ponteiros para funções Suponha que o método da bisecção fosse aplicado a um conjunto de funções. Um vetor de ponteiros para funções poderia ser utilizado. O exemplo a seguir apresenta o uso de ponteiros para funções. 23/5/2011 12

#include <assert.h> find_roots.h #include <math.h> #include <stdio.h> #define N 4; typedef double dbl; typedef dbl (*pfdd)(dbl); extern int cnt; extern const dbl eps; dbl bisection(pfdd f, dbl a, dbl b); dbl f1(dbl x); dbl f2(dbl x); dbl f3(dbl x); bisection.c #include "find_roots.h" dbl bisection(pfdd f, dbl a, dbl b) dbl m = (a+b)/2.0; ++cnt; if(f(m)==0.0 b-a < eps) return m; else if (f(a)*f(m)<0.0) return bisection (f,a,m); else return bisection(f,m,b); 23/5/2011 13

Vetor de ponteiros para funções typedef dbl (*pdd) (dbl); Cria um tipo pfddd que representa ponteiro para função com um único argumento do tipo double e que retorna um double. dbl bisection (pfdd f, dbl a, dbl b); Utiliza o tipo pfdd Os protótipos abaixo são equivalentes: dbl bisection (dbl f(dbl), dbl a, dbl b); dbl bisection (dbl f(dbl x), dbl a, dbl b); 23/5/2011 14

#include find_roots.h int cnt=0; const dbl eps=1e-13; int main(void) int begin_cnt, nfct_calls, i; dbl a = -100.0; dbl b = 100.0; dbl root, val; dbl f [ N ] = NULL, f1, f2, f3; main.c for(i=1; i<n; ++i) assert(f [ i ] (a) * f[ i ] (b) <=0.0); begin_cnt = cnt; root = bisection(f [ i ],a,b); nfct_calls = cnt begin_cnt; val= f [ i ] (root); printf("%s%d\n%s%.15f\n%s%.15f\n", Para f[, i, ](x) a raiz aproximada x0 é: ", root, " Valor de f [,i, ](x0)=, val, Num, de chamadas do método =, nfct_calls); return 0; 23/5/2011 15

Vetor de ponteiros para funções pfdd f[n] = NULL, f1, f2, f3; Declara um vetor de n elementos do tipo pfdd. Teremos f [0] = NULL. As declarações abaixo são equivalentes pfdd f[n] = NULL, &f1, &f2, &f3; dbl (*f[n])(dbl) = NULL, f1, f2, f3; dbl (*f[n])(dbl) = NULL, &f1, &f2, &f3; root = bisection(f[ i], a, b) root = bisection(*f[i],a,b); 23/5/2011 16

fct.c #include find_roots.h dbl f1(dbl x) return (x*x*x x*x + 2.0*x 2.0); dbl f2(dbl x) return (sin(x) 0,7*x*x*x +3.0); dbl f3(dbl x) return (exp(0.13*x) x*x*x); 23/5/2011 17

Const & Volatile O padrão ANSI C introduziu os qualificadores de tipo const e volatile. Const e volatile são qualificadores de tipo por restringirem ou qualificarem a forma como um identificador de determinado tipo pode ser usado. A declaração cost costuma aparecer após uma classe de armazenagem static const int k=3; k pode ser iniciado e, depois disso, não pode ser atribuído, incrementado, decrementado ou modificado de alguma outra forma já que é const. 23/5/2011 18

const int a=7 int Const & Volatile *p = &a; /* o compilador irá reclamar*/ Motivo: o ponteiro não poderá alterar o valor de a, pois violaria o conceito de que a é constante. const int a = 7; const int *p = &a; Agora, p é um ponteiro para uma constante inteira e seu valor é o endereço de a. O ponteiro p não é constante e podemos atribuir a ele algum outro endereço. Não podemos atribuir um valor para *p, pois o objeto apontado por p não pode ser modificado. 23/5/2011 19

int a; int * const p = &a; Const & Volatile Agora, p é um ponteiro constante do tipo inteiro e seu valor inicial é o endereço de a. Não podemos atribuir um valor para p, mas podemos atribuir um valor para *p. const int a=7; const int *const p=&a; Agora, p é um ponteiro constante que aponta para uma constante inteira. Nem p e nem *p pode ser atribuídos, incrementados ou decrementados. 23/5/2011 20

Const & Volatile O tipo qualificador volatile é raramente utilizado. Um objeto volatile pode ser modificado de alguma forma pelo hardware. extern const volatile int real_time_clock; O temo extern indica que o compilador deve procurar nesse arquivo ou in algum outro arquivo. O qualificador volatile indica que o objeto pode ser alterado pelo hardware. O qualificador const indica que o objeto não pode ser atribuído, incrementado, decrementado dentro do programa. O hardware pode mudar o clock, mas o código não. 23/5/2011 21

Strings A linguagem C armazena cadeia de caracteres (string) utilizando vetores. Cada posição do vetor armazena um caractere. Uma cadeia de caracteres (string) em C pode ser vista como uma coleção de bytes terminado pelo caractere NULL ( \0 ). O caractere NULL é atribuído automaticamente ao final da declaração de uma constante de string em C. O caractere NULL deve ser atribuído pelo usuário ao criar uma string via teclado. 23/5/2011 22

Strings Diferença entre x e x. char expr = x ; char expr = x ; Declare cadeias de caracteres maiores do que o necessário para evitar sobrescrever conteúdos. char nome[10] = João Oliveira da Silva Melo e Souza. Posições de memória reservadas a outras variáveis poderão ser sobrescritas gerando um erro difícil de ser detectado.

Strings Uma string constante como abc é tratada como ponteiro. As expressões a seguir são válidas: abc[1] e *( abc + 2) char *p = abc ; printf( %s %s\n, p, p+1); /* abc bc é exibido */ Há diferença entre vetores e ponteiros na manipulação de strings. char *p = abcde ; e char s[ ]= abcde ; p a b c d e \0 s a b c d e \0

#include <ctype.h> Strings Exemplo Int word_cnt (const char *s) int cnt = 0; while (*s!= \0 ) while(isspace(*s)) ++s; if(*s!= \0 ) ++cnt; /*pula espaços em branco*/ /*encontra uma palavra*/ while(! isspace(*s) && *s!= \0 ) ++s; /*pula a palavra*/ 23/5/2011 25

Strings Funções que manipulam cadeias de caracteres char *strcat(char *s1, const char s2); concatena s1 e s2 colocando o resultado em s1. int strcmp(const char *s1, const char *s2); Compara duas cadeias de caracteres, retornando: Valor = 0, se as cadeias forem idênticas. Valor < 0, se string1 for lexicograficamente menor que string2. Valor > 0, se string 1 for lexicograficamente maior que string 2. char *strcpy(char *s1, const char *s2); Copia os caracteres em s2 para s1 até \0 ser copiado. Os caracteres em s1, se houver, são sobrescritos. O ponteiro s1 é retornado. size_t strlen(const char *s); retorna o número de caracteres de string antes de \0.

String size_t strlen(const char *s) size_t n; for(n=0; *s!= \0 ; ++s) ++n; return n; char *strcpy(char *s1, register const char *s2) register char *p=s1; while (*p++ == *s2++) ; return s1; 23/5/2011 27

String char *strc1;at(char *s1, register const char *s2) register char *p=s1; while (*p) ++p; while (*p++ = *s2++) ; return s1; 23/5/2011 28

Referências Ascencio AFG, Campos EAV. Fundamentos de programação de computadores. São Paulo : Pearson Prentice Hall, 2006. 385 p. Kelley, A.; Pohl, I., A Book on C: programming in C. 4ª Edição. Massachusetts: Pearson, 2010, 726p. Kernighan, B.W.; Ritchie, D.M. C, A Linguagem de Programação: padrão ANSI. 2ª Edição. Rio de Janeiro: Campus, 1989, 290p. Schildt, Herbet, C Completo e Total, Pearson, 2006, 23/5/2011 29

FIM Aula 17