Estrutura de Dados TAD (Tipo Abstrato de Dados) Criando a primeira estrutura
TAD Um tipo de dado abstrato pode ser definido como um conjunto de valores e uma coleção de operações que atual sobre esses valores. As operações devem ser consistentes com os tipos de valores (MORAES, C.R., 2001, P5)
Definindo tipos em C A maioria das linguagens compartilham o mesmo tipo primitivo de dados como int (para inteiros) float (para ponto flutuante sem precisão) double (para pontos flutuantes com precisão) char (para caracteres) string (para cadeia de caracteres) entre outros
Definindo tipos em C Podemos dar outro nome para os tipos primitivos Por exemplo, imagine chamar o tipo int de INTEIRO, ou até mesmo NUMEROSNATURAIS Ou chamar tipo char de CARACTERES Ou chamar o tipo float de NUMEROQUEBRADO (rsrs) Em C temos o comando typedef o qual dá um novo nome para um tipo
Definindo tipos em C #include <stdio.h> typedef int NUMERO; // definimos que o tipo int será chamado de NUMERO main(){ NUMERO a, b, total; //ao invés de declarar como int, declaramos como NUMERO a = 2; b = 3; total = a + b; printf( O total da soma é %d, total);
Estrutura para guardar dados Algumas vezes precisamos guardar dados Para isso, criaremos estruturas, cada uma responsável por guardar os dados em uma hierarquia específica Como modelar essa estrutura? Como inicializamos esta estrutura? Como acessamos os campos desta estrutura?
Struct Imagine que temos uma ficha para preencher sobre uma pessoa, nesta ficha temos Nome Idade Peso Altura Nome: Josafá Moisés Idade: 32 Peso: 85 Altura: 1.78 Ficha Cadastral
Struct Esta ficha é um conjunto de dados sobre uma pessoa, neste caso, o senhor Josafá Podemos ter uma ficha de outra pessoa, digamos que a Delfina Nome: Josafá Moisés Idade: 32 Peso: 85 Altura: 1.78 Ficha Cadastral
Struct Ficha Cadastral Ficha Cadastral Nome: Josafá Moisés Idade: 32 Peso: 85 Altura: 1.78 Nome: Delfina Pereira Idade: 39 Peso: 61 Altura: 1.55
Estrutura para guardar dados Temos agora uma estrutura (Ficha Cadastral) e duas fichas preenchidas com dados pessoais, uma para Josafá outra para Delfina Como podemos modelar a estrutura desta ficha cadastral em linguagem de programação?
Estrutura para guardar dados Em Java, utilizaremos o paradigma orientado a objetos Podemos criar uma classe chamada FichaCadastral e depois instanciar os objetos (Veja o próximo slide)
Código Java public class FichaCadastral{ String nome; int idade; float peso; float altura; public class EstruturaSimples{ public static void main(string[] args){ FichaCadastral pessoa1 = new FichaCadastral(); FichaCadastral pessoa2 = new FichaCadastral(); pessoa1.nome = Josafa Moises; pessoa1.idade = 32;... pessoa2.nome = Delfina Pereira; pessoa2.idade = 39;...
Criando uma estrutura simples em C Em C não temos o conceito de classes Mas temos um ancestral das classes: a STRUCT Struct Define uma estrutura com os campos definidos entre as chaves struct{ int altura; int peso;
Criando uma estrutura simples em C Uma Struct pode ser vista como um novo tipo de dado, o qual é formado por composição de variáveis de outros tipos Uma Struct é um agrupamento de dados Cadastro de pessoas Todas as informações como Nome, Idade, Peso e altura pertencem a uma pessoa Logo, podemos agrupar estes dados Isso facilita lidar com dados de outras pessoas no mesmo programa
Criando uma estrutura simples em C Utilizaremos o comando typedef para definir o nome da struct, ficando assim typedef struct{ int altura; int peso; Pessoa;
Criando uma estrutura simples em C Voltando a ficha anterior, em Java criamos uma classe chamada FichaCadastral, então agora criaremos uma struct chamada FichaCadastral e depois vamos requisitar esta ficha no escopo principal do código C (Veja o próximo slide)
Código C typedef struct{ char nome[50]; int idade; float peso; float altura; FichaCadastral; main(){ FichaCadastral p1, p2; strcpy(p1.nome, Josafa Moises ); p1.idade = 32;... strcpy(p2.nome, Delfina Pereira ); p2.idade = 39;...
Exercício Declare uma estrutura capaz de armazenar o ra e 3 notas para um dado aluno
int x; int* y; //significa que x é uma variável do tipo inteiro //significa que y é uma variável do tipo endereço para inteiro O símbolo de asterisco após a palavra int indica que estamos falando de um endereço para a memória, e não para um valor na memória Veja o código no próximo slide
#include <stdio.h> int main(void) { int a; int* b; a = 100; //a variável a recebe o valor 100 b = &a; //a variável b recebe o endereço de memória da variável a printf("o valor de b eh: %d", b); //imprime o valor de b, que será o endereço de a
#include <stdio.h> int main(void) { int a; int* b; a = 100; //a variável a recebe o valor 100 b = &a; //a variável b recebe o endereço de memória da variável a printf("o valor de b eh: %d", *b); //agora será impresso o conteúdo presente no endereço de a confuso??? Veja no próximo slide o passo a passo da execução
Na memória foi reservado um espaço para o conteúdo da variável a. Este espaço está no endereço 854245. #include <stdio.h> Variável a (854245) int main(void) { int a; int* b; Saída na Tela: a = 100; b = &a; printf("o valor de b eh: %d", b);
Na memória foi reservado um espaço para o conteúdo da variável b. Este espaço está no endereço 835424. #include <stdio.h> Variável a (854245) Variável b (835424) int main(void) { int a; int* b; Saída na Tela: a = 100; b = &a; printf("o valor de b eh: %d", b);
O espaço na memória com endereço 854245, representado pela variável a recebe o valor 100. #include <stdio.h> int main(void) { int a; int* b; Variável a (854245) Variável b (835424) 100 Saída na Tela: a = 100; b = &a; printf("o valor de b eh: %d", b);
O espaço na memória com endereço 835424, representado pela variável b recebe o endereço da variável a, que é 854245. #include <stdio.h> int main(void) { int a; int* b; Variável a (854245) Variável b (835424) Saída na Tela: 100 854245 a = 100; b = &a; printf("o valor de b eh: %d", b);
O printf mostra o valor contido em b, neste caso, o endereço de a O endereço vai mudar de execução para execução!!! #include <stdio.h> int main(void) { int a; int* b; Variável a (854245) Variável b (835424) 100 854245 Saída na Tela: O valor de b eh: 854245 a = 100; b = &a; printf("o valor de b eh: %d", b);
Estamos mostrando o endereço da variável a que está na variável b Para mostrarmos o valor de a, colocaremos um asterisco antes da variável b no printf *b desta forma, não vamos mais mostrar o endereço de a, mas o valor que está contido naquele endereço Chamamos de ponteiro pois este aponta para um endereço de memória, e não para um valor
Na memória foi reservado um espaço para o conteúdo da variável a. Este espaço está no endereço 854245. #include <stdio.h> Variável a (854245) int main(void) { int a; int* b; Saída na Tela: a = 100; b = &a; printf("o valor de b eh: %d", *b);
Na memória foi reservado um espaço para o conteúdo da variável b. Este espaço está no endereço 835424. #include <stdio.h> Variável a (854245) Variável b (835424) int main(void) { int a; int* b; Saída na Tela: a = 100; b = &a; printf("o valor de b eh: %d", *b);
O espaço na memória com endereço 854245, representado pela variável a recebe o valor 100. #include <stdio.h> int main(void) { int a; int* b; Variável a (854245) Variável b (835424) 100 Saída na Tela: a = 100; b = &a; printf("o valor de b eh: %d", *b);
O espaço na memória com endereço 835424, representado pela variável b recebe o endereço da variável a, que é 854245. #include <stdio.h> int main(void) { int a; int* b; Variável a (854245) Variável b (835424) Saída na Tela: 100 854245 a = 100; b = &a; printf("o valor de b eh: %d", *b);
O *b apresentará o valor contido no endereço 854245 #include <stdio.h> int main(void) { int a; int* b; Variável a (854245) Variável b (835424) 100 854245 Saída na Tela: O valor de b eh: 100 a = 100; b = &a; printf("o valor de b eh: %d", *b);
Estamos mostrando o endereço da variável a que está na variável b Para mostrarmos o valor de a, colocaremos um asterisco antes da variável b no printf *b desta forma, não vamos mais mostrar o endereço de a, mas o valor que está contido naquele endereço Chamamos de ponteiro pois este aponta para um endereço de memória, e não para um valor
No próximo exemplo, vamos modificar o valor da variável a fazendo b receber um determinado valor, utilizando ponteiro
As variáveis a e b são declaradas e um espaço na memória é reservado para cada uma das variáveis, a estará no endereço 5421 e b no endereço 5638 #include <stdio.h> Variável a (5421) Variável b (5638) int main(void) { int a; int* b; Saída na Tela: a = 100; b = &a; *b =50; printf("o valor de a eh: %d", a);
A variável a recebe o valor 100. Ou seja, o espaço na memória cujo endereço é 5421 e é representado pela variável a, recebe o valor 100 #include <stdio.h> int main(void) { int a; int* b; Variável a (5421) Variável b (5638) 100 Saída na Tela: a = 100; b = &a; *b =50; printf("o valor de a eh: %d", a);
A variável b recebe o endereço da variável a. Ou seja, o espaço na memória cujo endereço é 5638 e é representado pela variável b, recebe o endereço 5421 #include <stdio.h> int main(void) { int a; int* b; Variável a (5421) Variável b (5638) Saída na Tela: 100 5421 a = 100; b = &a; *b =50; printf("o valor de a eh: %d", a);
Neste momento, é como se o espaço de memória da variável b deixasse de ser no endereço 5638 e passasse a ser no endereço 5421, ou seja, mesmo endereço de a #include <stdio.h> int main(void) { int a; int* b; Variável a (5421) Variável b (5638 5421) Saída na Tela: 100 5421 a = 100; b = &a; *b =50; printf("o valor de a eh: %d", a);
Quando colocamos o *b, dizemos que: o conteúdo para onde o endereço de memória de b aponta receberá o valor 50 #include <stdio.h> int main(void) { int a; int* b; Variável a (5421) Variável b (5638 5421) Saída na Tela: 100 50 5421 a = 100; b = &a; *b =50; printf("o valor de a eh: %d", a);
É como se b fosse uma ponte para a variável a. Tudo o que for atribuído ou manipulado na variável *b, será impactado na variável a, pois *b APONTA para o endereço de memória de a #include <stdio.h> int main(void) { int a; int* b; Variável a (5421) Variável b (5638 5421) Saída na Tela: 50 5421 a = 100; b = &a; *b =50; printf("o valor de a eh: %d", a);
Será impresso na tela o valor 50, que é o valor atual de a. #include <stdio.h> int main(void) { int a; int* b; Variável a (5421) Variável b (5638 5421) 50 5421 Saída na Tela: O valor de a eh: 50 a = 100; b = &a; *b =50; printf("o valor de a eh: %d", a);
Atividade 1) Quais serão os valores de x, y e p ao final do trecho de código abaixo? int x, y, *p; y = 0; p = &y; x = *p; x = 4; (*p)++; --x; (*p) += x; printf( x=%d y=%d p=%d,x,y,p);
Atividade 2) O programa abaixo possui erro(s). Qual(is)? Como deveria ser? main(){ int x, *p; x = 100; p = x; printf( Valor de p: %d, *p);