Registros
Programação de Computadores I
Natália Batista
https://sites.google.com/site/nataliacefetmg/
nataliabatista@decom.cefetmg.br
2º semestre/ 2017
CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS
1. Introdução
Registros: são conjuntos de dados logicamente relacionados, mas de tipos diferentes.
Exemplo:
voo
3
1. Introdução
Nome Matrícula Endereço
Curso
Aluno
1. Introdução
Número Cliente Endereço
Saldo
Conta
5
2. Registros
São estruturas de dados capazes de agregar várias informações de tipos distintos.
Permitem gerar novos tipos de dados.
São variáveis compostas heterogêneas.
A vantagem no uso dessas estruturas é permitir que os dados possam ser
organizados de forma mais clara e próxima
daquela que nós trabalhamos.
3. Campos de um registro
Campos:
Nome
Matrícula
Endereço
Curso
Nome Matrícula Endereço
Curso
Aluno
7
4. Definição
Definição
struct Aluno{
char Nome[100];
int Matricula;
char Endereco[100];
char Curso[30];
};
4. Definição
Forma geral:
struct nome_do_registro{
tipo campo1;
tipo campo2;
...
tipo campoN;
Uma definição
de estrutura
corresponde à
definição de um
9
4. Definição
A partir da estrutura definida, o programa poderá considerar que existe um novo tipo de dado a ser utilizado chamado
struct nome_do_registro.
4. Definição
Número Cliente Endereço
Saldo
Conta
Exercício: definir o registro Conta que tem a seguinte forma:
11
4. Definição
Definição
struct Conta{
int Numero;
char Cliente[100];
char Endereco[100];
float Saldo;
};
5. Declaração
Definição
Declaração
struct voo{
int numero;
int passageiros;
char destino[30];
};
struct voo TAM;
struct voo AZUL;
numero passageiros
destino numero passageiros
numero
13
5. Declaração
Definição
Declaração
struct Conta{
int Numero;
char Cliente[30];
char Endereco[50];
float Saldo;
};
struct Conta conta1;
struct Conta conta2;
Numero Cliente Endereco
Saldo Numero
Cliente Endereco
Saldo
5. Declaração
Definição
Declaração
struct Conta{
int Numero;
char Cliente[30];
char Endereco[50];
float Saldo;
};
struct Conta conta1;
struct Conta conta2;
struct Conta{
int Numero;
char Cliente[30];
char Endereco[50];
float Saldo;
} conta1, conta2;
Definição + declaração:
15
6. Preenchendo o registro
TAM.numero = 3502;
TAM.passageiros = 145;
strcpy(TAM.destino, “Manaus”);
voo
3502 145
“Manaus”
TAM
Um campo de cada vez, com valores constantes:
6. Preenchendo o registro
struct voo TAM = {3502, 145, “Manaus”};
voo
3502 145
“Manaus”
TAM
Carga inicial automática: declaração + inicialização
17
6. Preenchendo o registro
conta1.Numero = 5634;
strcpy(conta1.Cliente, “Joao da Silva”);
strcpy(conta1.Endereco, “Avenida Amazonas, 7675”);
conta1.Saldo = 1200000;
Número Cliente Endereço
Saldo
Conta
5634
Joao da Silva
Avenida Amazonas, 7675 1200000
conta1
Um campo de cada vez, com valores constantes:
6. Preenchendo o registro
Número Cliente Endereço
Saldo
Conta
5634
Joao da Silva
Avenida Amazonas, 7675
1200000
conta1
Carga inicial automática: definição + declaração + inicialização
struct Conta{
int Numero;
char Cliente[30];
char Endereco[50];
19
6. Preenchendo o registro
Fazer um programa para:
1. Declarar conta2 do tipo Conta.
2. Preencher com dados fornecidos pelo usuário.
3. Imprimir na tela os campos de conta2.
int main(){
struct Conta conta2;
printf("Digite o numero da conta: ");
scanf("%d%*c", &conta2.Numero);
printf("Digite o nome do cliente: ");
gets(conta2.Cliente);
printf("Digite o endereco: ");
gets(conta2.Endereco);
printf("Digite o saldo: ");
scanf("%f", &conta2.Saldo);
printf("Dados da conta:\n");
printf("%d\n", conta2.Numero);
printf("%s\n", conta2.Cliente);
printf("%s\n", conta2.Endereco);
printf("%f\n", conta2.Saldo);
#include <stdio.h>
struct Conta{
int Numero;
char Cliente[30];
char Endereco[50];
float Saldo;
};
21
7. Imprimindo os campos
printf("%d\n", TAM.numero);
printf("%d\n", TAM.passageiros);
printf("%s\n", TAM.destino);
3502 45
“Manaus”
TAM struct voo{
int numero;
int passageiros;
char destino[30];
};
8. typedef
Uma declaração com o prefixo typedef declara um novo nome para um tipo =>
produz sinônimos para nomes
typedef é uma palavra reservada da linguagem
Exemplos:
typedef unsigned char uchar; //define o sinônimo uchar para unsigned char;
typedef int inteiro; //define inteiro como sinônimo de int
typedef double real; //define real como sinônimo de double
uchar simbolo; //declarações
inteiro i, j;
23
8. typedef
typedef struct Pessoa { int idade;
char nome[100];
char endereco[50];
float salario;
} PESSOA;
struct Pessoa chefe, gerente;
OU
PESSOA chefe, gerente;
A questão do ESCOPO: onde definir estruturas e typedef?
se for em uma função, somente a função conhece a definição
está no escopo da função
para serem visíveis em todo o
programa devem ser declaradas fora de qualquer função e no início do programa
(Adaptado dos slides da Prof.ª Cristina Murta)
9. Atribuição de registros
#include <stdio.h>
int main() {
struct exemplo { char c;
int i;
float f;
double d;
};
struct exemplo s1, s2; //declarações
s1.c = 'a'; // '.' referencia o membro s1.i = 1;
s1.f = 3.14;
s1.d = 0.00093;
s2 = s1; //atribuição!
printf("A variável s2 contém: %c %d %f %f\n", s2.c, s2.i, s2.f, s2.d);
25
10. Registros aninhados
Registros dentro de registros
struct ponto { //define as coordenadas de um ponto no plano int x;
int y;
};
struct retangulo { //define um retangulo com um par de pontos struct ponto p1; //ponto inferior esquerdo
struct ponto p2; //ponto superior direito };
struct ponto p1, p2; // membros p1.x, p1.y, p2.x, p2.y struct ponto max = {320,200};
struct retangulo tela = {{0,0},{800,600}};
(Adaptado dos slides da Prof.ª Cristina Murta)
10. Registros aninhados
Outro exemplo:
#include <stdio.h>
#include <string.h>
typedef struct DATA { int Dia;
char Mes[10];
int Ano;
} Data;
typedef struct PESSOA { int idade;
char telefone[12];
Data nascimento;
} Pessoa;
int main(){
Pessoa Maria, Joao;
Maria.idade = 20;
strcpy(Maria.telefone, "3133333333");
Maria.nascimento.Dia = 29;
strcpy(Maria.nascimento.Mes, "Fevereiro");
Maria.nascimento.Ano = 1997;
printf("Idade: %d\n", Maria.idade);
printf("Telefone: %s\n", Maria.telefone);
printf("Nascimento: %d/%s/%d\n", Maria.nascimento.Dia,
Maria.nascimento.Mes, Maria.nascimento.Ano);
return 0;
27
11. Vetor de registros
struct endereco {
char nome[TAM_STRING];
char rua[TAM_STRING];
unsigned int numero;
char cidade[TAM_STRING];
char estado[2];
char telefone[10];
unsigned long int cep;
};
Uma vez definido o tipo, a definição das variáveis é feita da mesma forma:
struct endereco escola;
struct endereco cliente[100];
Acesso aos componentes é feito pelo operador .
variável.campo escola.nome
cliente[i].estado
(Adaptado dos slides da Prof.ª Cristina Murta)
12. Registros e funções
#include <stdio.h>
#include <math.h>
struct ponto { //define as coordenadas de um ponto no plano int x;
int y;
};
struct retangulo { //define um retangulo com um par de pontos struct ponto p1; //ponto inferior esquerdo
struct ponto p2; //ponto superior direito };
double distancia_origem (struct ponto p) { return sqrt(p.x * p.x + p.y * p.y);
};
double area_retangulo (struct retangulo r) {
return (r.p2.x r.p1.x) * (r.p2.y r.p1.y);
29
12. Registros e funções
int main() {
struct ponto max = {300,400};
struct ponto p1 = {0,0}, p2 = {800,600}; //membros p1.x, p1.y, p2.x, p2.y struct retangulo tela;
double dist, area;
tela.p1 = p1;
tela.p2 = p2;
dist = distancia_origem(max);
printf("Distancia: %lf\n", dist);
area = area_retangulo(tela);
printf("Area: %lf\n", area);
return 0;
}
(Adaptado dos slides da Prof.ª Cristina Murta)