ces-10 introduÇÃo À computaÇÃo capítulo vii tipos enumerativos e estruturas
TRANSCRIPT
CES-10 INTRODUÇÃO CES-10 INTRODUÇÃO À COMPUTAÇÃOÀ COMPUTAÇÃO
Capítulo VII Capítulo VII
Tipos Enumerativos e Tipos Enumerativos e EstruturasEstruturas
Capítulo VII – Tipos Capítulo VII – Tipos Enumerativos e Enumerativos e
EstruturasEstruturas
7.1 – Tipos enumerativos7.1 – Tipos enumerativos
7.2 – A necessidade de estruturas7.2 – A necessidade de estruturas
7.3 – Manipulação dos campos de uma 7.3 – Manipulação dos campos de uma estruturaestrutura
7.4 – Campos alternativos7.4 – Campos alternativos
7.1 – Tipos Enumerativos7.1 – Tipos Enumerativos
7.1.1 – Conceitos, declarações e 7.1.1 – Conceitos, declarações e expressõesexpressões
Valores manipulados até agora: números Valores manipulados até agora: números inteirosinteiros, , reaisreais e e caracterescaracteres
Tipos enumerativos: Tipos enumerativos: artifício da Linguagem C artifício da Linguagem C para se trabalhar com valores diferentes desses:para se trabalhar com valores diferentes desses:
Dias da semana, meses do ano, cores, estados Dias da semana, meses do ano, cores, estados civis de pessoas, naipes de baralho, etc.civis de pessoas, naipes de baralho, etc.
Exemplo: Exemplo: sejam as declaraçõessejam as declarações
enum diasemana {domingo, segunda, terca, quarta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};quinta, sexta, sabado};
enum mes {janeiro, fevereiro, marco, abril, maio, enum mes {janeiro, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, junho, julho, agosto, setembro, outubro, novembro, dezembro};dezembro};
enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};
Elas criam os seguintes novos Elas criam os seguintes novos tipos de tipos de variáveisvariáveis::
enum diasemana, enum mes e enum corenum diasemana, enum mes e enum cor
Os valores dessas variáveis serão Os valores dessas variáveis serão respectivamente:respectivamente:
{domingo, ..., sabado}, {janeiro, ..., dezembro} e {domingo, ..., sabado}, {janeiro, ..., dezembro} e {branca, ..., preta}{branca, ..., preta}
enum diasemana {domingo, segunda, terca, quarta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};quinta, sexta, sabado};
enum mes {janeiro, fevereiro, marco, abril, maio, enum mes {janeiro, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, junho, julho, agosto, setembro, outubro, novembro, dezembro};dezembro};
enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};
Declarações de variáveisDeclarações de variáveis::
enum diasemana hoje, ontem, amanha;enum diasemana hoje, ontem, amanha;
enum mes MesNascimento, MesAtual, MesPassado;enum mes MesNascimento, MesAtual, MesPassado;
enum cor cor1, cor2, cor3;enum cor cor1, cor2, cor3;
Outra forma de declarar variáveis:Outra forma de declarar variáveis:
enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado} hoje, ontem, amanha;sexta, sabado} hoje, ontem, amanha;
A palavra A palavra enumenum é obrigatória: é obrigatória:
enum diasemana hoje, ontem, amanha;enum diasemana hoje, ontem, amanha;
enum mes MesNascimento, MesAtual, MesPassado;enum mes MesNascimento, MesAtual, MesPassado;
enum cor cor1, cor2, cor3;enum cor cor1, cor2, cor3;
Mas pode-se dispensá-la mediante o uso de Mas pode-se dispensá-la mediante o uso de typedeftypedef::
typedef enum diasemana diasemana;typedef enum diasemana diasemana;
enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};
typedef enum cor cor;typedef enum cor cor;
enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};
diasemanadiasemana hoje, ontem, amanha; hoje, ontem, amanha;
corcor cor1, cor2, cor3; cor1, cor2, cor3;
No Borland,, enum cor pode ser usada num typedef antes de declarada
diasemana e cor passam a ser tipos equivalentes aos tipos enum diasemana e enum cor
typedef enum diasemana diasemana;typedef enum diasemana diasemana;
enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};
typedef enum cor cor;typedef enum cor cor;
enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};
diasemana hoje, ontem, amanha; diasemana hoje, ontem, amanha;
cor cor1, cor2, cor3;cor cor1, cor2, cor3;
As variáveis e os valores desses tipos podem As variáveis e os valores desses tipos podem ser usados em ser usados em atribuiçõesatribuições e e expressõesexpressões::
cor1 = azul;cor1 = azul;
if (ontem == segunda) hoje = terca;if (ontem == segunda) hoje = terca;
enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};
enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};
Na realidade, Na realidade, domingo, segunda, ... , sabado, branca, amarela, ... , domingo, segunda, ... , sabado, branca, amarela, ... , pretapreta
são são constantes inteirasconstantes inteiras como aquelas criadas como aquelas criadas por uma declaração por uma declaração constconst
Os Os valoresvalores dessas constantes dessas constantes não podem ser não podem ser alteradosalterados por nenhum comando do programa por nenhum comando do programa
Assim, o comandoAssim, o comando segunda = 5;segunda = 5;
não é aceitonão é aceito pelo compilador pelo compilador
enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};
enum cor {branca, amarela, azul, verde, vermelha, enum cor {branca, amarela, azul, verde, vermelha, marrom, cinza, preta};marrom, cinza, preta};
Por default, o compilador estabelece os Por default, o compilador estabelece os seguintes valores:seguintes valores:
Constante Valor Constante Valor
domingo 0 branca 0
segunda 1 amarela 1
terca 2 azul 2
quarta 3 verde 3
quinta 4 vermelha 4
sexta 5 marrom 5
sabado 6 cinza 6
preta 7
Pode-se Pode-se explicitarexplicitar o valor desejado para as o valor desejado para as constantesconstantes
ExemploExemplo: seja a seguinte declaração:: seja a seguinte declaração:
enum mes {janeiro, fevereiro = 7, marco, abril, maio, enum mes {janeiro, fevereiro = 7, marco, abril, maio, junho = 5, julho, agosto, setembro, outubro = 26, junho = 5, julho, agosto, setembro, outubro = 26, novembro, dezembro};novembro, dezembro};
Os valores das constantes serão:Os valores das constantes serão:Constant
eValor Constant
eValor Constant
eValor
janeiro 0 maio 10 setembro 8
fevereiro 7 junho 5 outubro 26
marco 8 julho 6 novembro
27
abril 9 agosto 7 dezembro
28
ExemploExemplo: variáveis lógicas simuladas por tipo : variáveis lógicas simuladas por tipo enumerativo:enumerativo:
typedef enum logic logic;typedef enum logic logic;
enum logic {False, True}; enum logic {False, True};
logic L1, L2, L3;logic L1, L2, L3;
Nestas declarações, as constantes Nestas declarações, as constantes FalseFalse e e TrueTrue têm respectivamente os valores têm respectivamente os valores 00 e e 11
7.1.2 – Entrada e saída amigável para 7.1.2 – Entrada e saída amigável para tipos enumerativostipos enumerativos
Sejam novamente as declarações:Sejam novamente as declarações:
typedef enum diasemana diasemana;typedef enum diasemana diasemana;
enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};
diasemana hoje, ontem, amanha;diasemana hoje, ontem, amanha;
A constante inteira A constante inteira quartaquarta não tem nada a ver não tem nada a ver com a cadeia de caracteres com a cadeia de caracteres “quarta”“quarta”
Isso dificulta a Isso dificulta a entrada e saída amigávelentrada e saída amigável para esses tipospara esses tipos
typedef enum diasemana diasemana;typedef enum diasemana diasemana;
enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};
diasemana hoje, ontem, amanha;diasemana hoje, ontem, amanha;
Por exemplo, numa Por exemplo, numa leituraleitura para a variável para a variável hojehoje, , deve ser usado um formato deve ser usado um formato inteirointeiro::
printf ("Entre com o dia de hoje: "); printf ("Entre com o dia de hoje: ");
scanf ("%d", &hoje);scanf ("%d", &hoje);
Então, caso o operador queira que o valor de Então, caso o operador queira que o valor de hoje hoje seja seja quartaquarta, ele deverá digitar , ele deverá digitar 33 e não a e não a cadeia cadeia quartaquarta
É necessário É necessário mais trabalhomais trabalho para tornar a para tornar a entrada amigávelentrada amigável (ver programa a seguir) (ver programa a seguir)
#include <stdio.h>#include <stdio.h>
#include <conio.h>#include <conio.h>
#include <string.h>#include <string.h>
/*/* Declaracoes de tiposDeclaracoes de tipos */*/
typedef char nome[10];typedef char nome[10];
typedef enum diasemana diasemana;typedef enum diasemana diasemana;
enum diasemana {domingo, segunda, terca, quarta, quinta, enum diasemana {domingo, segunda, terca, quarta, quinta, sexta, sabado};sexta, sabado};
/*/* Cabecalho e declaracoes de variaveisCabecalho e declaracoes de variaveis */*/
void main( ){void main( ){
diasemana hoje, ontem, amanha; char c;diasemana hoje, ontem, amanha; char c;
nome cadhoje, nome cadhoje, NomeDia[7] = {"domingo", "segunda", NomeDia[7] = {"domingo", "segunda", "terca", "quarta","terca", "quarta",
"quinta", "sexta", "sabado"}"quinta", "sexta", "sabado"};;
“domingo”
“segunda”
“terca”
“quarta”
“quinta”
“sexta”
“sabado”
0
1
2
3
4
5
6
NomeDiaPara o
operador digitar uma cadeia e não um númerocadhoje
/*/* Desejo de execucaoDesejo de execucao */*/
printf ("Conhecer dia de ontem e de amanhan? (s/n): ");printf ("Conhecer dia de ontem e de amanhan? (s/n): ");
c = getche ();c = getche ();
/*/* Leitura do dia de hojeLeitura do dia de hoje */*/
while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {
printf ("\n\n\tDigite o dia de hoje: "); scanf ("%s", printf ("\n\n\tDigite o dia de hoje: "); scanf ("%s", cadhoje);cadhoje);
/*/* Conversao da cadeia digitada para o tipo diasemanaConversao da cadeia digitada para o tipo diasemana*/*/
for (hoje = domingo; hoje <= sabado; hoje++)for (hoje = domingo; hoje <= sabado; hoje++)
if (strcmp (cadhoje, NomeDia[hoje]) == 0)if (strcmp (cadhoje, NomeDia[hoje]) == 0)
break;break;
“domingo”
“segunda”
“terca”
“quarta”
“quinta”
“sexta”
“sabado”
0
1
2
3
4
5
6
NomeDia
cadhoje
/*/* Caso de erro de digitacaoCaso de erro de digitacao */*/
if (hoje > sabado)if (hoje > sabado)
printf("\n\thoje: erro de digitacao\n\n");printf("\n\thoje: erro de digitacao\n\n");
/*/* Determinacao dos dias de ontem e amanhanDeterminacao dos dias de ontem e amanhan */*/
else {else {
ontem = (hoje + 6) % 7; amanha = (hoje + 1) % 7;ontem = (hoje + 6) % 7; amanha = (hoje + 1) % 7;
printf("\n\thoje = %s; ontem = %s; amanhan = %s;\n\printf("\n\thoje = %s; ontem = %s; amanhan = %s;\n\n",n",
NomeDia[hoje], NomeDia[ontem], NomeDia[hoje], NomeDia[ontem], NomeDia[amanha]);NomeDia[amanha]);
}}
/*/* Desejo de nova execucao Desejo de nova execucao */*/
printf ("Conhecer dia de ontem e de amanhan? (s/n): "); c = printf ("Conhecer dia de ontem e de amanhan? (s/n): "); c = getche ();getche ();
}}
}}
“domingo”
“segunda”
“terca”
“quarta”
“quinta”
“sexta”
“sabado”
0
1
2
3
4
5
6
NomeDia
Capítulo VII – Tipos Capítulo VII – Tipos Enumerativos e Enumerativos e
EstruturasEstruturas
7.1 – Tipos enumerativos7.1 – Tipos enumerativos
7.2 – A necessidade de estruturas7.2 – A necessidade de estruturas
7.3 – Manipulação dos campos de uma 7.3 – Manipulação dos campos de uma estruturaestrutura
7.4 – Campos alternativos7.4 – Campos alternativos
7.2 – A Necessidade de 7.2 – A Necessidade de EstruturasEstruturas
Em muitas aplicações, é útil poder tratar todas as Em muitas aplicações, é útil poder tratar todas as informações de uma entidadeinformações de uma entidade ou de uma pessoa ou de uma pessoa como sendo uma como sendo uma única unidadeúnica unidade
Por exemplo, é muito melhor dizer: Por exemplo, é muito melhor dizer: Levar o carro Levar o carro para casapara casa
do que dizerdo que dizer
Carro:Carro: entidadeentidade composta de composta de rodasrodas, , motormotor, , latarialataria, etc., etc.
Levar as rodas do carro para casaLevar o motor do carro para casaLevar os bancos do carro para casaLevar a lataria do carro para casaLevar o painel do carro para casaEtc.
No entanto, nessas mesmas aplicações, pode No entanto, nessas mesmas aplicações, pode ser importante também a capacidade de se ser importante também a capacidade de se tratar tratar cada uma dessas informações em cada uma dessas informações em separadoseparado
Por exemplo:Por exemplo:
Consertar um pneu do carro Ligar o motor do carro Ajustar o banco do motoristaLavar a lataria do carroAcender o painel do carroEtc.
Exemplo: declarações para cadastrar os Exemplo: declarações para cadastrar os empregados de uma empresaempregados de uma empresa
Informações sobre um empregado
Nome
Endereço
Telefone
Sexo
Estado civil
Data de
nascimento
Data de
admissão
Cargo
Setor de
trabalho
Salário
LogradouroNúmeroComplementosBairroCidadeEstadoPaís
DiaMêsAno
DiaMêsAno
Ao ser admitido, todas as informações do empregado são inseridas no cadastro
Ao ser demitido, todas as informações do empregado são deletadas do cadastro
Ao mudar de endereço ou de salário ou de estado civil, nem todas as informações do empregado são manipuladas
Estruturas de dados para o cadastro dos empregados
O vetor de empregados é composto de elementos de mesmo tipo
Mas cada empregado guarda informações de diversos tipos
Um endereço também guarda informações de diversos tipos
Variáveis do tipo empregado e do tipo endereço são estruturadas heterogêneas
Também são genericamente denominadas estruturas
Em C, usa-se a declaração struct
Struct Struct para endereço:para endereço:
struct endereco {struct endereco {
char logradouro[15]; int numero;char logradouro[15]; int numero;
char complemento[6], bairro[10], cidade[10], estado[3], char complemento[6], bairro[10], cidade[10], estado[3], pais[10];pais[10];
};};
Esta declaração cria o novo Esta declaração cria o novo tipo de variáveistipo de variáveis::
struct enderecostruct endereco
Campos Campos das variáveis desse tipo:das variáveis desse tipo:logradouro, numero, complemento, bairro, cidade, estado, pais
struct endereco {struct endereco {
char logradouro[15]; int numero;char logradouro[15]; int numero;
char complemento[6], bairro[10], cidade[10], estado[3], char complemento[6], bairro[10], cidade[10], estado[3], pais[10];pais[10];
};};
Declaração de variáveis desse tipo:Declaração de variáveis desse tipo:
struct endereco ender1, ender2, ender3;struct endereco ender1, ender2, ender3;
Outra forma de declarar variáveis:Outra forma de declarar variáveis:
struct endereco {struct endereco {
char logradouro[15]; int numero;char logradouro[15]; int numero;
char complemento[6], bairro[10], cidade[10], char complemento[6], bairro[10], cidade[10], estado[3], pais[10];estado[3], pais[10];
} ender1, ender2, ender3} ender1, ender2, ender3;;
A palavra A palavra structstruct é obrigatória: é obrigatória:
struct endereco ender1, ender2, ender3;struct endereco ender1, ender2, ender3;
Mas pode-se dispensá-la mediante o uso de Mas pode-se dispensá-la mediante o uso de typedeftypedef::
typedef struct endereco endereco;typedef struct endereco endereco;
struct endereco {struct endereco {
char logradouro[15];char logradouro[15];
int numero;int numero;
char complemento[6], bairro[10], cidade[10], char complemento[6], bairro[10], cidade[10],
estado[3], pais[10];estado[3], pais[10];
};};
endereco ender1, ender2, ender3;endereco ender1, ender2, ender3;No Borland, struct endereco pode ser usada num typedef, antes de declarada
endereco passa a ser um tipo equivalente ao tipo struct endereco
Struct Struct para empregado:para empregado:
struct empregado {struct empregado {
char nome[20], cargo[10], setor[10];char nome[20], cargo[10], setor[10];
endereco ender; int tel;endereco ender; int tel;
sexo sex; civil estciv;sexo sex; civil estciv;
data nasc, adm;data nasc, adm;
float salario;float salario;
};};
typedef int data[3];
sexo e civil são tipos enumerativos (ver declarações a seguir)
typedef int data[3];typedef int data[3];
typedef enum sexo sexo;typedef enum sexo sexo;
typedef enum estcivil civil;typedef enum estcivil civil;
typedef struct endereco endereco;typedef struct endereco endereco;
typedef struct empregado empregado;typedef struct empregado empregado;
enum sexo {masc, fem};enum sexo {masc, fem};
enum estcivil {solt,cas,viuvo,desq,divorc};enum estcivil {solt,cas,viuvo,desq,divorc};
struct endereco {struct endereco {
char lograd[15], compl[6], bairro[10], cidade[10], char lograd[15], compl[6], bairro[10], cidade[10], estado[3], pais[10];estado[3], pais[10];
int numero;int numero;
};};
struct empregado {struct empregado {
char nome[20], cargo[10], setor[10];char nome[20], cargo[10], setor[10];
endereco ender; int tel;endereco ender; int tel;
sexo sex; civil estciv;sexo sex; civil estciv;
data nasc, adm;data nasc, adm;
float salario;float salario;
};};
Obs.: um campo de uma struct pode ser outra struct
Declaração do cadastro:
empregado Cadastro [1000];
sizeof (Cadastro) =
138000 bytes
Capítulo VII – Tipos Capítulo VII – Tipos Enumerativos e Enumerativos e
EstruturasEstruturas
7.1 – Tipos enumerativos7.1 – Tipos enumerativos
7.2 – A necessidade de estruturas7.2 – A necessidade de estruturas
7.3 – Manipulação dos campos de uma 7.3 – Manipulação dos campos de uma estruturaestrutura
7.4 – Campos alternativos7.4 – Campos alternativos
7.3 – Manipulação dos 7.3 – Manipulação dos Campos de uma EstruturaCampos de uma Estrutura
7.3.1 – Acesso aos campos de uma estrutura7.3.1 – Acesso aos campos de uma estrutura
Para acessar individualmente os Para acessar individualmente os camposcampos de uma de uma estruturaestrutura, usa-se o operador , usa-se o operador ‘.’‘.’ ( (pontoponto))
Por exemplo, declarando-se Por exemplo, declarando-se empregado E1, E2, empregado E1, E2, E3;E3;
pode-se fazer atribuições aos campos pode-se fazer atribuições aos campos teltel, , estcivestciv e e salariosalario::
E1.tel = 31874622; E1.tel = 31874622; E2.estciv = cas; E2.estciv = cas;
E3.salario = 6000,00;E3.salario = 6000,00;
O O logradouro do endereço de E1logradouro do endereço de E1 pode receber pode receber um valor, usando-se a função um valor, usando-se a função strcpystrcpy::
strcpy (E1.ender.lograd, “Nove de Julho”);strcpy (E1.ender.lograd, “Nove de Julho”);
CamposCampos de estruturas também podem de estruturas também podem receber receber valores lidosvalores lidos e podem ser e podem ser escritosescritos no vídeo ou no vídeo ou em arquivos:em arquivos:
gets (Cadastro[i].ender.lograd);gets (Cadastro[i].ender.lograd);
scanf("%d",&Cadastro[i].ender.numero);scanf("%d",&Cadastro[i].ender.numero);
printf("%s",Cadastro[i].ender.lograd);printf("%s",Cadastro[i].ender.lograd);
printf("%5d",Cadastro[i].ender.numero);printf("%5d",Cadastro[i].ender.numero);
A seguir, um A seguir, um programaprograma para para lerler de um arquivo e de um arquivo e escreverescrever no vídeo as informações de no vídeo as informações de todos os todos os empregadosempregados de um cadastro ( de um cadastro (reduziu-sereduziu-se as as informações a serem guardadas) informações a serem guardadas)
Exemplo: programa para cadastramento Exemplo: programa para cadastramento dos empregados de uma empresados empregados de uma empresa
Informações sobre um empregado
Nome
Endereço
Estado civil
Data de
admissão
Salário
LogradouroNúmeroBairro
DiaMêsAno
#include <stdio.h>#include <stdio.h>
#include <conio.h>#include <conio.h>
/*/* Definicao dos tiposDefinicao dos tipos */*/
typedef int data[3];typedef int data[3];
typedef enum estcivil civil;typedef enum estcivil civil;
typedef struct endereco endereco;typedef struct endereco endereco;
typedef struct empregado empregado;typedef struct empregado empregado;
/*/* Definicao do tipo enumerativoDefinicao do tipo enumerativo */*/
enum estcivil {solt, cas, viuvo, desq, divorc}; enum estcivil {solt, cas, viuvo, desq, divorc};
/*/* Definicao das estruturasDefinicao das estruturas */*/
struct endereco {struct endereco {
char lograd[26], bairro[20]; int numero;char lograd[26], bairro[20]; int numero;
};};
struct empregado {struct empregado {
char nome[31]; endereco ender;char nome[31]; endereco ender;
civil estciv; data nasc; int salario;civil estciv; data nasc; int salario;
};};
/*/* Vetor com os nomes dos estados civisVetor com os nomes dos estados civis*/*/
char EstadoCivil[][12]char EstadoCivil[][12]
= {"solteiro", "casado", "viuvo", = {"solteiro", "casado", "viuvo", "desquitado", "desquitado", "divorciado"}; "divorciado"};
Para escrever os estados civis ao invés de números
“solteiro”
“casado”
“viuvo”
“desquitado”
“divorciado”
0
1
2
3
4
EstadoCivil
/*/* Cabecalho da main e declaracoes locaisCabecalho da main e declaracoes locais*/*/
void main(){void main(){
int i, n; char c;int i, n; char c;
empregado Cadastro[10];empregado Cadastro[10];
FILE *filein;FILE *filein;
/*/* Abertura do arquivo de dadosAbertura do arquivo de dados */*/
filein = fopen ("Empregados.dat", "r");filein = fopen ("Empregados.dat", "r");
/*/* Tamanho da estrutura empregadoTamanho da estrutura empregado */*/
printf ("Tamanho da estrutura empregado: %d printf ("Tamanho da estrutura empregado: %d bytes", bytes",
sizeof (empregado));sizeof (empregado));
A título de curiosidade
/*/* Leitura do cadastro dos empregadosLeitura do cadastro dos empregados */*/
fscanf (filein, "%d", &n); // Leitura do numero de fscanf (filein, "%d", &n); // Leitura do numero de empregadosempregados
for(i = 0; i < n; i++) {for(i = 0; i < n; i++) {
fscanf (filein, "%c", &c); // Eliminacao de enter fscanf (filein, "%c", &c); // Eliminacao de enter do arquivodo arquivo
fgets (Cadastro[i].nome, 31, filein);fgets (Cadastro[i].nome, 31, filein);
fgets (Cadastro[i].ender.lograd, 26, filein);fgets (Cadastro[i].ender.lograd, 26, filein);
fscanf(filein, "%d", &Cadastro[i].ender.numero);fscanf(filein, "%d", &Cadastro[i].ender.numero);
fgets (Cadastro[i].ender.bairro, 21, filein);fgets (Cadastro[i].ender.bairro, 21, filein);
fscanf(filein, "%d", &Cadastro[i].estciv);fscanf(filein, "%d", &Cadastro[i].estciv);
fscanf(filein, "%d%d%d",fscanf(filein, "%d%d%d",
&Cadastro[i].nasc[0], &Cadastro[i].nasc[0],
&Cadastro[i].nasc[1], &Cadastro[i].nasc[1], &Cadastro[i].nasc[2]);&Cadastro[i].nasc[2]);
fscanf(filein, "%d", &Cadastro[i].salario);fscanf(filein, "%d", &Cadastro[i].salario);
}}
O arquivo de dados deve ser preparado cuidadosamente
Os espaços entre os dados são relevantes para evitar erros na leitura
/*/* Escrita do cadastro dos empregadosEscrita do cadastro dos empregados */*/
printf ("\n\n\nListagem dos Empregados:");printf ("\n\n\nListagem dos Empregados:");
for(i = 0; i < n; i++) {for(i = 0; i < n; i++) {
printf("\n\n%d)\nNome: %s", i+1, Cadastro[i].nome);printf("\n\n%d)\nNome: %s", i+1, Cadastro[i].nome);
printf("\nEndereco: %s",Cadastro[i].ender.lograd);printf("\nEndereco: %s",Cadastro[i].ender.lograd);
printf(", %7d",Cadastro[i].ender.numero);printf(", %7d",Cadastro[i].ender.numero);
printf(", %s",Cadastro[i].ender.bairro);printf(", %s",Cadastro[i].ender.bairro);
printf("\nEstado Civil: printf("\nEstado Civil: %s",EstadoCivil[Cadastro[i].estciv]);%s",EstadoCivil[Cadastro[i].estciv]);
printf("\nData de Nascimento: %2.2d/%2.2d/%d",printf("\nData de Nascimento: %2.2d/%2.2d/%d",
Cadastro[i].nasc[0], Cadastro[i].nasc[1], Cadastro[i].nasc[0], Cadastro[i].nasc[1], Cadastro[i].nasc[2]);Cadastro[i].nasc[2]);
printf("\nSalario: %d",Cadastro[i].salario);printf("\nSalario: %d",Cadastro[i].salario);
}}
/*/* Fechamento da telaFechamento da tela */*/
printf ("\n\nDigite algo para encerrar: "); getch ();printf ("\n\nDigite algo para encerrar: "); getch ();
}}
“solteiro”
“casado”
“viuvo”
“desquitado”
“divorciado”
0
1
2
3
4
EstadoCivil
Arquivo de dados “Empregados.dat”:Arquivo de dados “Empregados.dat”:
44
Julio Silva Souza R Direita 301Julio Silva Souza R Direita 301 Centro 3 14 3 1987 1300Centro 3 14 3 1987 1300
Maria Ramos Leite Av 9 de Julho 2091Maria Ramos Leite Av 9 de Julho 2091 Aclimacao Aclimacao 0 15 9 1993 20000 15 9 1993 2000
Adalberto Correia Pr Jose Silva 14Adalberto Correia Pr Jose Silva 14 Butanta Butanta 1 25 11 1968 82001 25 11 1968 8200
Bianca Rocha Camargo R Augusta 1271Bianca Rocha Camargo R Augusta 1271 Jardins Jardins 2 2 4 1975 150002 2 4 1975 15000
fgets (Cadastro[i].nome, 31, filein);fgets (Cadastro[i].nome, 31, filein);
fgets (Cadastro[i].ender.lograd, 26, filein);fgets (Cadastro[i].ender.lograd, 26, filein);
fscanf(filein, "%d", fscanf(filein, "%d", &Cadastro[i].ender.numero);&Cadastro[i].ender.numero);
fgets (Cadastro[i].ender.bairro, 21, filein);fgets (Cadastro[i].ender.bairro, 21, filein);
30 espaços
25 espaços
20 espaços
Resultado no vídeo:Resultado no vídeo:
7.3.2 – Inicialização e atribuição de 7.3.2 – Inicialização e atribuição de estruturasestruturas
EstruturasEstruturas também podem ser também podem ser inicializadasinicializadas em suas declarações; exemplo: em suas declarações; exemplo:
typedef struct endereco endereco;typedef struct endereco endereco;
struct endereco {struct endereco {
char lograd[30];char lograd[30]; int numero;int numero; char char bairro[15];bairro[15];
};};
O resultado da seguinte declaração está O resultado da seguinte declaração está abaixo: abaixo:
endereco ender = {“Av. Nove de Julho”, 1300, “Centro”};endereco ender = {“Av. Nove de Julho”, 1300, “Centro”};Av. Nove de Julho■ Centro■1300
ender
lograd numero bairro
\0
Exemplo: Inicialização de matriz de Exemplo: Inicialização de matriz de estruturasestruturas
Seja o seguinte trecho de programa: Seja o seguinte trecho de programa:
struct complexo {float real, imag;};struct complexo {float real, imag;};
typedef struct complexo complexo;typedef struct complexo complexo;
int i, j; int i, j; complexo A[3][3] = {complexo A[3][3] = {
{{1.0, -0.1},{2.0, -0.2},{3.0, 4.3}},{{1.0, -0.1},{2.0, -0.2},{3.0, 4.3}},
{{4.0, -3.4},{5.0, 4.1},{6.0, -2.6}}{{4.0, -3.4},{5.0, 4.1},{6.0, -2.6}}
};};
for (i = 0; i < 3; i++) {for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++)for (j = 0; j < 3; j++)
printf ("(%5.1f) + i(%5.1f) ", A[i][j].real, printf ("(%5.1f) + i(%5.1f) ", A[i][j].real, A[i][j].imag);A[i][j].imag);
printf ("\n");printf ("\n");
}}
1.0 -0.1
2.0 -0.2
3.0 4.3
4.0 -3.4
5.0 4.1 6.0 -2.6
0.0 0.0 0.0 0.0 0.0 0.0
A
0 1 2
0
1
2
( 1.0) + i( -0.1) ( 2.0) + i( -0.2) ( 3.0) + i( 4.3)( 4.0) + i( -3.4) ( 5.0) + i( 4.1) ( 6.0) + i( -2.6)( 0.0) + i( 0.0) ( 0.0) + i( 0.0) ( 0.0) + i( 0.0)
Resultado no vídeo
Diferentemente das Diferentemente das variáveis indexadasvariáveis indexadas, uma , uma variável do tipo variável do tipo structstruct pode pode receberreceber numa numa atribuição o atribuição o valor de outravalor de outra do mesmo tipo do mesmo tipo
Exemplo: Exemplo: sejam as declarações:sejam as declarações:
typedef struct endereco endereco;typedef struct endereco endereco;
struct endereco {struct endereco {
char lograd[30];char lograd[30]; int numero;int numero; char bairro[15];char bairro[15];
};};
endereco ender1 = {“Av. Nove de Julho”, 1300, “Centro”}, endereco ender1 = {“Av. Nove de Julho”, 1300, “Centro”}, ender2;ender2;
ender2 = ender1;ender2 = ender1; equivale aequivale astrcpy (ender2.lograd, ender1.lograd);ender2.numero = ender1.numero;strcpy (ender2.bairro, ender1.bairro);
Exemplo: Exemplo: sejam as declarações:sejam as declarações:
typedef struct matriz matriz;typedef struct matriz matriz;
struct matriz {int A[5][3];}struct matriz {int A[5][3];}
int B[5][3], C[5][3];int B[5][3], C[5][3];
matriz M1, M2;matriz M1, M2;
““Se você não pode passar um elefante por Se você não pode passar um elefante por debaixo de uma porta, coloque-o dentro de debaixo de uma porta, coloque-o dentro de um envelope e passe-o.”um envelope e passe-o.”
““Se não é possível fazer atribuições entre Se não é possível fazer atribuições entre variáveis indexadas, colocando-as em variáveis indexadas, colocando-as em estruturas, isso se torna possível”estruturas, isso se torna possível”
Tendo M1 e B sido previamente inicializadas,
C = B; é proibido
M2 = M1; é válido
O uso de O uso de estruturasestruturas para guardar para guardar vetoresvetores e e matrizesmatrizes apresenta uma outra apresenta uma outra vantagemvantagem
Trabalhando com Trabalhando com matrizesmatrizes, seus , seus elementoselementos são guardados numa variável e seu são guardados numa variável e seu numero de numero de linhas e colunaslinhas e colunas ficam em outras variáveis ficam em outras variáveis
No entanto, No entanto, todastodas essas informações dizem essas informações dizem respeito a uma respeito a uma mesma entidademesma entidade, sugerindo , sugerindo que fiquem armazenadas numa que fiquem armazenadas numa mesma mesma variávelvariável
Com estruturas isso é possível:Com estruturas isso é possível:typedef struct matriz matriz;struct matriz {int Elementos[10][10]; int nlin, ncol;};matriz A, B, C;
Em quase todos os exemplos vistos com variáveis indexadas, isso se aplica
Exercícios 7.3:Exercícios 7.3:1.