Buscar

Aula11 Structs RICARDO

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

*
*
Estrutura de Dados
STRUCTS
Dilvan Moreira
*
*
Objetivos
Entender o que são e como usar:
Estrutura de Dados para a Linguagem C
Structs (Registros)
*
*
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. 
*
*
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
*
*
Lembrando: gets()
Lê uma string do teclado
gets(nome_da_string);
#include <stdio.h>
void main () {
 char string[100];
 printf ("Digite o seu nome: ");
 gets (string);
 printf ("\n\n Ola %s", string);
} 
*
*
Lembrando: strcpy()
Copia a string origem para a string destino
strcpy(string_destino, string_origem); 
#include <stdio.h>
#include <string.h>
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);
}
*
*
#include <stdio.h>
#include <string.h>
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()
*
*
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
*
*
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
*
*
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;
};
*
*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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().
*
*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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.
*
*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 “.” .
*
*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 “.” .
*
*
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
*
*
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”
*
*
#include <stdio.h>
#include <stdlib.h>
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...
*
*
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...
*
*
#include <stdio.h>
#include <stdlib.h>
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;
};
*
*
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 TYPEDEF
COM TYPEDEF
Declarando variável “al” do tipo aluno
Declarando variável “al” do tipo aluno
struct aluno al;
aluno al;
*
*
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?
*
*
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
*
*
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 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.
*
*
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...
*
*
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)
*
*
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...
*
*
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
*
*
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.
*
*
Modos de utilização de arquivos
*
*
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);
 }
}
*
*
Escrevendo arquivos de Texto
#include <stdio.h>
#include <stdlib.h>
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;
}
*
*
Lendo arquivos de Texto
#include <stdio.h>
#include <stdlib.h>
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);
}
*
*
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

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando