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

Estrutura de Programas e Tipos de Dados Simples

Estruturas Dinâmicas - Ponteiros

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 em Linguagem C Parte II

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

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

ponteiros INF Programação I Prof. Roberto Azevedo

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

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

Comandos de Decisão Parte I

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

Introdução a Programação de Jogos

Programação Estruturada

Aula 1 Apresentação do Curso

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

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

12 - Dados Estruturados Vetores, Matrizes e Strings

Programação: Vetores

Algoritmos e Programação

Linguagem C ponteiros

Introdução à Programação

Tipos de Dados Avançados Vetores e Matrizes

Cadeias de Caracteres (Strings)

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

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

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

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

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

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

Estruturas de Dados. Profa. Juliana Pinheiro Campos

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

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

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

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

Conhecendo a Linguagem de Programação C

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

Apêndice B. Cadeias de Caracteres (Strings)

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

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

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

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

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

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 Computação

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

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Profa Rosana Braga

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

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

Módulo 7 Cadeias de Caracteres

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

1ª Lista de Exercícios

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

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

Programação Estruturada

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

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

BCC202 - Estrutura de Dados I

3. Linguagem de Programação C

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

Revisão de linguagem C

Linguagem de Programação. Thiago Leite Francisco Barretto

Introdução à Linguagem C

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 a Programação. Ponteiros e Passagem de Argumentos por Referência

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

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

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

#include <stdio.h> #define nl 3 #define nc 4 main () { int matriz[nl][nc],*p,i; for (i=0, p=&matriz[0][0];i<nl*nc;i++) *(p++)=i+1; for (i=0,

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

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

Funções em C. Lucas Ferrari de Oliveira Professor Adjunto. Linguagem de Programação Estruturada I. Universidade Federal do Paraná

FUNDAÇÃO UNIVERSIDADE FEDERAL DO VALE DO SÃO FRANCISCO

Carlos Eduardo Batista. Centro de Informática - UFPB

Cap. 3 Entrada e Saída e Controle de Fluxo

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

DAS5102 Fundamentos da Estrutura da Informação

Introdução à Programação

Elementos de Linguagem C

Caracteres e Cadeias de Caracteres

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

O que é um apontador em C (type pointer in C)?

Plano de Aula Segunda-feira Tarde 13/10/2014 Objetivo: Introduzir o conceito de alocação dinâmica na memória e registros / structs.

Linguagem C: Tipos básicos de dados escalares e cadeia de caracteres. Prof. Leonardo Barreto Campos 1

ECT1203 Linguagem 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 Typedef Macros Exemplos Vetor de ponteiros para funções const & volatile 01/06/2011 2

Typedef Utilizado para criar novos nomes de tipos de dado. #define N 3 typedef double scalar; typedef scalar vector[n]; typedef scalar matrix[n][n]; Também poderíamos ter utilizado: typedef vector matrix[n]; O uso de typedef permite ao programador pensar em termos da aplicação desenvolvida. 01/06/2011 3

Typedef void soma(vector x, vector y, vector z) int i; for (i=0; i<n; ++i) x[i] = y[i] + z[i]; scalar produto_scalar(vector x, vector y, vector z) int i; scalar sum = 0.0; for (i=0; i<n; ++i) sum += x[i] * y[i]; return sum; 01/06/2011 4

Typedef void produto_matriz(matrix a, matrix b, matrix c) int i, j, k; for(i=0; i<n; ++i) for(j=0; j<n; ++j) a[i][j]=0.0; for(k=0; k<n; ++k) a[i][j] += b[i][k]*c[k][j]; 01/06/2011 5

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)); 01/06/2011 6

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 01/06/2011 7

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. 01/06/2011 8

Macro - Assert #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); \\se condição for falsa sai do programa e mostra mensagem \\tipicamente com nome do arq. e num. da linha b=g(c);... 01/06/2011 9

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

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; 01/06/2011 11

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); 01/06/2011 12

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); 01/06/2011 13

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; 01/06/2011 14

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. 01/06/2011 15

#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); 01/06/2011 16

Vetor de ponteiros para funções typedef dbl (*pfdd) (dbl); Cria um tipo pfdd 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); 01/06/2011 17

#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; 01/06/2011 18

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); 01/06/2011 19

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); 01/06/2011 20

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. 01/06/2011 21

Const & Volatile const int a=7 int *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. 01/06/2011 22

Const & Volatile int a; int * const p = &a; 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. 01/06/2011 23

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. 01/06/2011 24

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. 01/06/2011 25

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)) /*pula espaços em branco*/ ++s; if(*s!= \0 ) /*encontra uma palavra*/ ++cnt; while(! isspace(*s) && *s!= \0 ) /*pula a palavra*/ ++s; 01/06/2011 28

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; 01/06/2011 30

String char *strc1;at(char *s1, register const char *s2) register char *p=s1; while (*p) ++p; while (*p++ = *s2++) ; return s1; 01/06/2011 31

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, 01/06/2011 32

Exercício Faça um programa que leia uma matriz bidimensional digitada pelo usuário, onde: Cada elemento da matriz armazena um valor de 0-255 O tamanho da matriz é informado pelo usuário Realize a operação de convolução dessa matriz com uma outra matriz de tamanho 5x5

Exercício Kernel do filtro Gaussiano (matrix de 5x5)

FIM Aula 17