Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouElisa Quintão Camilo Alterado mais de 8 anos atrás
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.