A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Estrutura de Dados STRUCTS Dilvan Moreira. Objetivos  Entender o que são e como usar:  Estrutura de Dados para a Linguagem C  Structs (Registros)

Apresentações semelhantes


Apresentação em tema: "Estrutura de Dados STRUCTS Dilvan Moreira. Objetivos  Entender o que são e como usar:  Estrutura de Dados para a Linguagem C  Structs (Registros)"— Transcrição da apresentação:

1 Estrutura de Dados STRUCTS Dilvan Moreira

2 Objetivos  Entender o que são e como usar:  Estrutura de Dados para a Linguagem C  Structs (Registros)

3 Lembrando: Strings  Não existe um tipo string em C  Strings são vetores de chars.  A declaração geral para uma string é: char nome_da_string [tamanho];  Strings têm o seu último elemento como um '\0'.  O tamanho da string deve incluir o '\0' final.

4 Lembrando: Manipulando Strings  Como strings não são tipos primitivos em C  não podem ser manipulados diretamente  Não se pode igualar duas strings string1 = string2; //Nao funciona. Por que?  Para remediar essa situação a biblioteca padrão do C vem com várias funções para manipular strings

5 Lembrando: gets()  Lê uma string do teclado  gets(nome_da_string); #include void main () { char string[100]; printf ("Digite o seu nome: "); gets (string); printf ("\n\n Ola %s", string); }

6 Lembrando: strcpy()  Copia a string origem para a string destino  strcpy(string_destino, string_origem); #include void main () { char str1[100], str2[100], str3[100]; printf ("Entre com uma string: "); gets (str1); strcpy (str2, str1); /* Copia str1 em str2 */ strcpy (str3, "Voce digitou a string "); /* Copia "Voce digitou a string" em str3 */ printf ("\n\n%s%s", str3, str2); }

7 #include void main () { char str1[100], str2[100]; printf ("Entre com uma string: "); gets (str1); printf ("\n\n Entre com outra string: "); gets (str2); if (strcmp(str1,str2)) printf ("\n\n As duas strings são diferentes."); else printf ("\n\n As duas strings são iguais."); } Lembrando: strcmp()

8 Structs – Estruturas (Registros)  A linguagem C oferece tipos primitivos para declaração de variáveis  int, float, char e double  Exemplos: int idade=18; char nome[100]; float saldo = 1049.25;  Além disso, podemos usar Vetores e Matrizes para declarar uma séries de variáveis do mesmo tipo  Strings  Vetor de inteiros

9 Motivação  No entanto, muitas vezes precisamos declarar variáveis com mais de um tipo primitivo  Exemplo  Como declarar variáveis para um programa que faz cadastro de alunos de uma universidade? Código do aluno Nome e Sobrenome Sexo Média Ponderada

10 Structs - Registros  A linguagem C permite “criar” novos tipos de variáveis agrupando outros tipos de variáveis  Structs (Registros)  Exemplo – Struct para um Aluno struct aluno{ int codigo; char nome[100]; char sexo; float media; };

11 #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main(){ struct aluno al; al.codigo=7389098; strcpy(al.nome, "Joao da Silva"); al.sexo='M'; printf("Media: "); scanf("%f", &al.media); printf("%d %s %c %.2f \n",al.codigo, al.nome, al.sexo, al.media); return 0; } #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main(){ struct aluno al; al.codigo=7389098; strcpy(al.nome, "Joao da Silva"); al.sexo='M'; printf("Media: "); scanf("%f", &al.media); printf("%d %s %c %.2f \n",al.codigo, al.nome, al.sexo, al.media); return 0; } Definição da struct do tipo aluno. Em geral, é declarada fora da função main().

12 #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main(){ struct aluno al; al.codigo=7389098; strcpy(al.nome, "Joao da Silva"); al.sexo='M'; printf("Media: "); scanf("%f", &al.media); printf("%d %s %c %.2f \n",al.codigo, al.nome, al.sexo, al.media); return 0; } #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main(){ struct aluno al; al.codigo=7389098; strcpy(al.nome, "Joao da Silva"); al.sexo='M'; printf("Media: "); scanf("%f", &al.media); printf("%d %s %c %.2f \n",al.codigo, al.nome, al.sexo, al.media); return 0; } Declaração da variável “al” do tipo “aluno”. Todas as variaveis agrupadas na struct são declaradas automaticamente.

13 #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main(){ struct aluno al; al.codigo=7389098; strcpy(al.nome, "Joao da Silva"); al.sexo='M'; printf("Media: "); scanf("%f", &al.media); printf("%d %s %c %.2f \n",al.codigo, al.nome, al.sexo, al.media); return 0; } #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main(){ struct aluno al; al.codigo=7389098; strcpy(al.nome, "Joao da Silva"); al.sexo='M'; printf("Media: "); scanf("%f", &al.media); printf("%d %s %c %.2f \n",al.codigo, al.nome, al.sexo, al.media); return 0; } O acesso às variáveis do registro, em geral, é por meio do ponto “.”.

14 #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main(){ struct aluno al; al.codigo=7389098; strcpy(al.nome, "Joao da Silva"); al.sexo='M'; printf("Media: "); scanf("%f", &al.media); printf("%d %s %c %.2f \n",al.codigo, al.nome, al.sexo, al.media); return 0; } #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main(){ struct aluno al; al.codigo=7389098; strcpy(al.nome, "Joao da Silva"); al.sexo='M'; printf("Media: "); scanf("%f", &al.media); printf("%d %s %c %.2f \n",al.codigo, al.nome, al.sexo, al.media); return 0; } O formato existente para leitura de dados (scanf) e escrita (printf) continua o mesmo. A diferença é que o programador deve acessar as variáveis do registro por meio do ponto “.”.

15 Declaração geral de Structs struct nome_do_novo_tipo { tipo variavel1; tipo variavel2;... };  O nome do tipo deve seguir as mesmas regras para nomear variáveis  Outras possibilidades:  Vetores de structs  Uma variável struct que agrega outras structs

16 Vetores e Structs  Vetores (e Matrizes) com Structs podem ser utilizados de forma análoga aos tipos básicos struct aluno{ int codigo; char nome[100]; char sexo; float media; }; struct aluno al[100]; Exemplo: declarando um vetor com 100 variáveis do tipo “aluno”

17 #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main() { struct aluno al[100]; printf("Digite o codigo: "); scanf("%d", &al[0].codigo); printf("Codigo digitado: %d\n", al[0].codigo); return 0; } #include struct aluno{ int codigo; char nome[100]; char sexo; float media; }; int main() { struct aluno al[100]; printf("Digite o codigo: "); scanf("%d", &al[0].codigo); printf("Codigo digitado: %d\n", al[0].codigo); return 0; } Declarando um vetor com variáveis do tipo aluno. Acessando as posições do vetor...

18 Agregando várias Structs  Considere que queremos registrar a data de nascimento no cadastro de alunos... struct data_nascimento{ int dia; int mes; int ano; }; struct aluno{ int codigo; char nome[100]; char sexo; float media; struct data_nascimento dn; }; Uma struct pode agregar outras structs...

19 #include struct data_nascimento{ int dia; int mes; int ano; }; int main() { struct aluno al; strcpy(al.nome,"Joao da Silva"); al.dn.dia=19; al.dn.mes=05; al.dn.ano=1984; printf("O aluno %s nasceu em %d/%d/%d\n",al.nome,al.dn.dia, al.dn.mes, al.dn.ano); return 0; } #include struct data_nascimento{ int dia; int mes; int ano; }; int main() { struct aluno al; strcpy(al.nome,"Joao da Silva"); al.dn.dia=19; al.dn.mes=05; al.dn.ano=1984; printf("O aluno %s nasceu em %d/%d/%d\n",al.nome,al.dn.dia, al.dn.mes, al.dn.ano); return 0; } struct aluno{ int codigo; char nome[100]; char sexo; float media; struct data_nascimento dn; };

20 Usando “typedef”  Uma utilidade da linguagem C para auxiliar a criação de tipos definidos pelo usuário struct aluno{ int codigo; char nome[100]; char sexo; float media; }; typedef struct{ int codigo; char nome[100]; char sexo; float media; } aluno; SEM TYPEDEFCOM TYPEDEF Declarando variável “al” do tipo aluno struct aluno al;aluno al;

21 Salvando Structs  Structs permitem criar um novo tipo de dados  Em geral, utilizamos como registro para tipos específicos de um determinado programa  Até o momento, todos os nossos registros ficam armazenados em memória RAM  Os dados serão perdidos quando o computador for reiniciado (ou programa ser finalizado)  Como recuperar nossos registros (Structs) em uma nova execução do programa?

22 Manipulando arquivos em C  Podemos gravar nossos registros em memória secundária (ex. discos rígidos) por meio de arquivos  Funções para manipular arquivos binários  fopen: abertura de arquivo  fwrite: escrita de contéudo em um arquivo  fread: leitura de conteúdo de arquivo  fclose: fecha um arquivo após a manipulação

23 Escrevendo em um arquivo struct Pessoa{ char nome[50]; int idade; }; int main(){ struct Pessoa p; printf("Digite o nome: "); gets(p.nome); printf("Digite a idade: "); scanf("%d", &p.idade); FILE *arquivo; arquivo = fopen("dados.dat", "wb"); fwrite(&p, sizeof(struct Pessoa), 1, arquivo); fclose(arquivo); }

24 Escrevendo em um arquivo struct Pessoa{ char nome[50]; int idade; }; int main(){ struct Pessoa p; printf("Digite o nome: "); gets(p.nome); printf("Digite a idade: "); scanf("%d", &p.idade); FILE *arquivo; arquivo = fopen("dados.dat", "wb"); fwrite(&p, sizeof(struct Pessoa), 1, arquivo); fclose(arquivo); } Registro do tipo Pessoa que queremos gravar em arquivo.

25 Escrevendo em um arquivo struct Pessoa{ char nome[50]; int idade; }; int main(){ struct Pessoa p; printf("Digite o nome: "); gets(p.nome); printf("Digite a idade: "); scanf("%d", &p.idade); FILE *arquivo; arquivo = fopen("dados.dat", "wb"); fwrite(&p, sizeof(struct Pessoa), 1, arquivo); fclose(arquivo); } Declarando nossa variável “p” do tipo Pessoa e definindo seus valores...

26 Escrevendo em um arquivo struct Pessoa{ char nome[50]; int idade; }; int main(){ struct Pessoa p; printf("Digite o nome: "); gets(p.nome); printf("Digite a idade: "); scanf("%d", &p.idade); FILE *arquivo; arquivo = fopen("dados.dat", "wb"); fwrite(&p, sizeof(struct Pessoa), 1, arquivo); fclose(arquivo); } Declarando uma variável do tipo FILE (arquivo)

27 Escrevendo em um arquivo struct Pessoa{ char nome[50]; int idade; }; int main(){ struct Pessoa p; printf("Digite o nome: "); gets(p.nome); printf("Digite a idade: "); scanf("%d", &p.idade); FILE *arquivo; arquivo = fopen("dados.dat", "wb"); fwrite(&p, sizeof(struct Pessoa), 1, arquivo); fclose(arquivo); } Abrindo arquivo para escrita: - dados.dat é o arquivo de destino - “wb” é o modo de abertura...

28 Escrevendo em um arquivo struct Pessoa{ char nome[50]; int idade; }; int main(){ struct Pessoa p; printf("Digite o nome: "); gets(p.nome); printf("Digite a idade: "); scanf("%d", &p.idade); FILE *arquivo; arquivo = fopen("dados.dat", "wb"); fwrite(&p, sizeof(struct Pessoa), 1, arquivo); fclose(arquivo); } Escrevendo no arquivo... - &p : variável que será escrita - sizeof() : tamanho em bytes do tipo - arquivo : variável do tipo FILE

29 Escrevendo em um arquivo struct Pessoa{ char nome[50]; int idade; }; int main(){ struct Pessoa p; printf("Digite o nome: "); gets(p.nome); printf("Digite a idade: "); scanf("%d", &p.idade); FILE *arquivo; arquivo = fopen("dados.dat", "wb"); fwrite(&p, sizeof(struct Pessoa), 1, arquivo); fclose(arquivo); } Fechando o arquivo... - Atenção! Sempre fechar o arquivo... - Os dados são efetivamente salvos após fechar o arquivo.

30 Modos de utilização de arquivos

31 Lendo em um arquivo struct Pessoa{ char nome[50]; int idade; }; int main(){ struct Pessoa p[3]; int i; FILE *arquivo; arquivo = fopen("dados.dat", "rb"); for(i=0; i < 3; i++) fread(&p[i], sizeof(struct Pessoa), 1, arquivo); fclose(arquivo); for(i=0; i < 3; i++){ printf("Nome: %s\n",p[i].nome); printf("Idade: %d\n",p[i].idade); }

32 Escrevendo arquivos de Texto #include int main(){ char texto[1024]; printf("Digite um texto: "); gets(texto); FILE *arquivo; arquivo = fopen("dados.txt", "w"); fprintf(arquivo, texto); fclose(arquivo); return 0; }

33 Lendo arquivos de Texto #include int main(){ char str[1024]; FILE *arquivo; arquivo = fopen("dados.txt", "r"); do{ fscanf(arquivo, "%s", str); printf("%s ",str); }while(!feof(arquivo)); fclose(arquivo); }

34 Exercício...  Crie um novo tipo de dados (Struct) para registrar funcionários de uma empresa:  Nome do funcionário  Idade  Salário  Faça um programa para cadastrar 3 funcionários  Gravar os dados em um arquivo binário  Recuperar os dados de um arquivo binário


Carregar ppt "Estrutura de Dados STRUCTS Dilvan Moreira. Objetivos  Entender o que são e como usar:  Estrutura de Dados para a Linguagem C  Structs (Registros)"

Apresentações semelhantes


Anúncios Google