estruturas de dados aula 2: estruturas estáticas 07/04/2014

32
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Upload: internet

Post on 21-Apr-2015

116 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Estruturas de DadosAula 2: Estruturas Estáticas

07/04/2014

Page 2: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Tipos Básicos

• Quantos valores distintos podemos representar com os tipos básicos?

long long int 8 bytes -9223372036854775807 9223372036854775807

unsigned long long int 8 bytes 0 18446744073709551615

Page 3: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Operadores de Incremento e Decremento em C

• ++ e --– Incrementa ou decrementa o valor de uma variável de

uma unidade– O incremento/decremento pode ser antes ou depois da

variável ser usada• N++, incrementa n depois de ser usado• ++N, incrementa n antes de ser usado

Page 4: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Operador sizeoftipo size_t em geral = unsigned int

• Retorna o número de bytes ocupado por um determinado tipo– size_t a = sizeof (float);– Armazena 4 na variável a, pois um float (número real de

ponto flutuante) ocupa 4 bytes de memória

• Também pode ser usado em uma variável, retornando o número de bytes ocupado por esta variável– double x = 17.0;

size_t b = sizeof(x); // b == 8

Page 5: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Conversão de tipo

• Ou “Type Casting”– Conversão é feita automaticamente pelo C na avaliação

de expressões– Pode ser requisitado explicitamente pelo programador

C não tem arredondamento como função• Truque: Macro

#define ROUND(x) ((int)(x+0.5))

Page 6: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Entrada e saída

• São feitas com uso de funções• Função printf

– printf (formato, lista de constantes/variáveis/expr...);

%c char%d int%ld long int%u unsigned int%f float%lf double%e float ou double em notação científica%g float ou double em notação mais apropriada (%f ou %g)%s string = cadeia de caracteres%p ponteiro (em hexadecimal), e.g. 0xf5874a8c

Page 7: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Entrada e saída

printf ("Inteiro = %d Real = %g", 33, 5.3);

com saída:Inteiro = 33 Real = 5.3

• Caracteres de escape\b volta um campo (“backspace”)

Page 8: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Entrada e saída

• Especificação do tamanho do campo

Page 9: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Entrada e saída

• scanf (formato, lista de endereços das variáveis...)

int n;scanf ("%d", &n);

Page 10: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Funções

• Comando de definição de uma função

Tipo_retorno nome_função (lista de parâmetros){

Corpo da função

}

Page 11: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Definição de Funções

Page 12: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Pilha de Execução

• Variáveis locais têm escopo local• Funções são independentes entre si• Transferência de dados entre funções através de

– Passagem de parâmetros – Valor de retorno

• Parâmetros em C são passados por valor• Pilha de Execução: Coordena comunicação entre a

função que chama e a função chamada– Permite passagem de parâmetros e valores de retorno

Page 13: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Esquema representativo da memória

• Porém na memória existem somente bits com valores 0 e 1 = Representação

• A semântica surge na entrada/saída das variáveis

Page 14: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Exemplo fat (5)

Page 15: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Pilha de execução

Page 16: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Ponteiro de variáveis

• Pode ser necessário comunicar mais de um valor de retorno para função que chama

• Por exemplo, uma função que deve calcular a soma e o produto de dois números

#include <stdio.h>

void somaprod (int a, int b, int c, int d)

{ c = a + b;

d = a * b; printf("VAR. LOCAL: soma=%d produto=%d\n",c, d); // ok

}

int main (int argc, char** argv)

{

int s, p;

somaprod (3, 5, s, p); // NÃO FUNCIONA!!! Por quê?

printf (“soma = %d produto =%d\n”, s, p);

return 0;

}

Page 17: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Ponteiros

• Permitem manipulação direta de endereços de memória no C

• Variáveis do tipo ponteiro– Armazenam endereços de memória– É possível definir um ponteiro para cada tipo do C que

seja capaz de armazenar endereços de memória em que existem valores do tipo correspondente

– int a; – int* p; // p armazena endereço de memória em que há

valor inteiro

Page 18: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Operadores de ponteiros

• Operador & (“endereço de”)– Aplicado a variáveis, retorna o endereço da posição de

memória reservada para variável

• Operador * (“conteúdo de”)– Aplicado a ponteiros, acessa o conteúdo de memória do

endereço armazenado pela variável ponteiro

Page 19: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Exemplo

• int a; int* p; int c;

Page 20: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Exemplos

#include <stdio.h>#include <stdlib.h>int main (int argc, char** argv){

int a;int *p = NULL;p = &a;*p = 2;printf (“a=%d “, a);

return EXIT_SUCCESS;

}

Imprime o valor 2

Page 21: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Exemplos

int main (void){

int a, b, *p;a = 2;*p = 3;b = a + (*p);printf (“ %d “, b);return 0;

}AVISO na compilação: 'p' usado sem ser inicializado ERRO na execução! “Segmentation fault”Ponteiro p aponta para endereço indefinido e tenta

atribuir valor 3 a esse endereço, ou seja, p invade memória fora do seu escopo.

Page 22: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Passando ponteiros para função

• Ponteiros permitem modificar o valor das variáveis indiretamente

• Possível solução para passagem por ref!

void somaprod (int a, int b, int *p, int *q){ *p = a + b; *q = a * b; }

int main (int argc, char** argv){

int s, p; somaprod (3, 5, &s, &p); printf (“soma = %d produto =%d\n”, s, p);

return EXIT_SUCCESS;}

Page 23: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Exemplo “swap”

#include <stdio.h>#include <stdlib.h>

void troca (int *px, int *py){ int temp; temp = *px; *px = *py; *py = temp; }

int main (int argc, char** argv){

int a = 5, b = 7;

printf (“ANTES: a=%d b=%d\n”, a, b); troca(&a, &b);

printf (“DEPOIS: a=%d b=%d\n”, a, b); return EXIT_SUCCESS;}

Page 24: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Exemplo

Page 25: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Variáveis Globais

• Declaradas fora do escopo das funções• São visíveis a todas as funções• Existem enquanto o programa existir (não estão na

pilha de execução)• Utilização:

– Devem ser usadas com critério– Podem criar muita dependência entre as funções– Dificulta o entendimento e o reuso de código– Encapsulamento: Acesso via 'get' e 'set'

Page 26: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Exemplo de Variáveis Globais

Page 27: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Exemplo de variável estática

• Função que imprime números reais– Imprime um número por vez (máximo de 5 números por

linha)void imprime (float a)

{static int n=1;

printf (“ %f “, a);

if ((n%5) == 0) printf (“ \n”);

n++;

}

Main:imprime(1.0); imprime(2.0); imprime(3.0);imprime(4.0); imprime(5.0); imprime(6.0);===> 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000

Page 28: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Variáveis Estáticas

• Declaradas no escopo de funções (ou globais)• Existem enquanto o programa existir (não estão na

pilha de execução)• Somente são visíveis dentro das funções nas quais são

declaradas• Utilização

– Quando for necessário recuperar o valor de uma variável na execução passada da função

Page 29: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Sobre variáveis estáticas e globais...

• Variáveis estáticas e globais são inicializadas com zero, quando não forem explicitamente inicializadas

• Variáveis globais estáticas– São visíveis para todas funções subsequentes– Não podem ser acessadas por funções de outros

arquivosstatic int x;

• Funções estáticas– Não podem ser acessadas por funções de outros

arquivosstatic float f(float)

Page 30: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Pré-processador e Macros

• Código C antes de ser compilado é passado pelo pré-processador

• O Pré-processador– Reconhece diretivas– Altera o código e envia para o compilador– Substituição no nível sintático (textual) do programa

• Diretiva #include– O pré-processador substitui pelo corpo do arquivo

especificado

Page 31: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Pré-processador e Macros

• # include “nome_do_arquivo”– Procura o arquivo do diretório local– Caso não encontre, procura nos diretórios de include

especificados para compilação

• # include <nome_do_arquivo>– Não procura no diretório local

• Para ver o resultado do pré-processador (Compilador GNU C em Unix)

gcc -c -E prog.c > progpreprocessado.c

Page 32: Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014

Pré-processador e Macros

• Constantes– #define PI 3.1415

• Macros– Definição com parâmetros– #define MAX (a,b) ((a)>(b)?(a):(b))– O pré-processador substituirá o trecho de código:

v = 4.5;c = MAX (v, 3.0);

– Por:

v = 4.5;c = ((v) > (3.0) ? (v): (3.0));