Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula21 Estruturas PDF
Aula21 Estruturas PDF
Registros
Estruturas em C 5
21.1 Estrutura: Declaração - Struct
A definição da estrutura Dados (struct Dados) indica que a
partir daquele momento o compilador passa a conhecer um
outro tipo, chamado struct Dados, que é composto por um
inteiro, dois caracteres e um vetor de 20 caracteres. E uma
variável pessoa do tipo Dados
idade pessoa.idade
nome[20] pessoa.nome
struct Dados
Nome do novo tipo de dado
{
int idade; Campo idade do tipo int
char est_civil, sexo;
Campo estado civil e sexo do
char nome[20];
tipo char
} pessoa;
Campo nome do tipo string
Estruturas em C 13
21.3 Estrutura: Carga Inicial Automática
Uma Estrutura pode ser iniciada quando ela é declarada. Para
tanto, usa-se a seguinte sintaxe:
struct nome_estrutura variavel = { valor1, valor2,..., valorn}
Coloca-se entre chaves os valores dos membros da
estrutura, pela ordem em que eles foram escritos na sua
definição.
Estruturas em C 16
21.4 Estruturas: typedef
Todas as vezes em que se for declarar uma variável do tipo
estrutura fora do local de definição da mesma, é necessário
colocar antes do nome da variável a palavra reservada struct
seguida do nome da estrutura.
Ex: struct Data d1; declaração da variável d1
main()
{ Dt d1; Não é necessário empregar a
d1.Dia = 26; palavra struct Data e sim apenas Dt.
d1.Mes = “Jan”;
Estruturas em C 19
d1.Ano = 93; }
21.4 Estruturas: typedef
A seguir são ilustradas as três formas possíveis para se declarar
um novo tipo Data utilizando struct com ou sem typedef:
struct Data typedef struct Data
struct Data
{ {
{
int Dia, Ano; int Dia, Ano;
int Dia, Ano;
char Mes[20]; char Mes[20];
char Mes[20];
}; } Dt;
};
typedef struct Data Dt;
main()
main() main()
{ struct Data d1;
{ Dt d1; { Dt d1;
d1.Dia = 26;
d1.Dia = 26; d1.Dia = 26;
d1.Mes = “Jan”;
d1.Mes = “Jan”; d1.Mes = “Jan”;
d1.Ano = 93;}
d1.Ano =Estruturas
93; } em C d1.Ano = 93; } 20
21.4 Estruturas: typedef
Exemplo 7 – Atribuições
#include <stdio.h> Atribuição de valores
typedef struct Data entre estruturas:
{int Dia, Ano; char Mes[20];} Dt;
main() d2 = d1;
{
Equivale à:
int n_Dias;
Dt d2, d1 = {23, 67, “Jan”}; d2.Dia = d1.Dia;
printf(“Data inicial e:”);
printf(“%d/%s/%d\n”,d1.Dia,d1.Mes,d1.Ano); d2.Mes = d1.Mes;
d2 = d1; d2.Ano = d2.Ano;
printf(“Entre com n. de dias:”);
scanf(“%d”,&n_Dias); Observe que para vetor
d2.Dia = d1.Dia + n_Dias; e matriz a atribuição
printf(“A nova data e:”); é sempre feita
printf(“%d/%s/%d\n”,d2.Dia,d2.Mes,d2.Ano); elemento por elemento!
}
Estruturas em C 23
21.5 Novos Tipos: funções + struct
2. O programa terá uma função (addDia) que que vai receber a
data atual d1 e o número de dias que se quer adicionar e ela
vai calcular e devolver nova data d2;
Estruturas em C 24
21.5 Novos Tipos: funções + struct
Calendário Gregoriano
1 1 1 1
365,242199 365
4 100 400 3300
Cada 4 anos + 1 dia
Calendário Gregoriano
Ano Bissexto Algoritmo
Se resto(ano/100) é 0
(a) Não divisível por 100 e
Se (ano/400) é 0
divisível por 4.
então bissexto; (b)
Senão não_bissexto; (c)
(b) Divisível por 100 e 400.
Senão
Se resto(ano/4) é 0
(c) Os demais anos não
então bissexto; (a)
são Bissextos.
Senão não_bissexto; (c)
33
Estruturas em C 38
21.6 Estrutura: Exemplos Resolvidos
if (op == 2)
{ printf( "\nDigite o nome do cliente a ser consultado ");
gets(nome_cliente);
achou = 0;
for (i=0;i<15;i++)
{ if (stricmp(conta[i].nome,nome_cliente) == 0)
{printf( "\nNumero conta: %d Saldo:%.2f ",
conta[i].num, conta[i].saldo);
achou = 1; }
} // Fim for
if (achou == 0)
printf("\nNao existe conta cadastrada para este
cliente!");
getch();
}// Fim if (op==2)
34
Estruturas em C 39
21.6 Estrutura: Exemplos Resolvidos
if (op == 3)
{ i = 0;
achou = 0;
while (i < 15)
{ if (conta[i].num != 0)
{ if (i==0)
{ menor_saldo = conta[i].saldo;
posi = i; }
else if (conta[i].saldo < menor_saldo)
{ menor_saldo = conta[i].saldo;
posi = i; }
achou = 1;
}
i++;
} // Fim while
if (achou == 0)
printf( "\nNenhuma conta foi cadastrada!");
else // excluir a conta
{ for (i=posi;i<14;i++)
{ conta[i] Estruturas
= conta[i+1];
em C
} 40
35
21.6 Estrutura: Exemplos Resolvidos
conta[i].num = 0;
strcpy(conta[i].nome,"\0");
conta[i].saldo = 0;
printf("\nConta excluida com sucesso!");
} // Fim else excluir a conta
getch();
} // Fim if (op==3)
} while (op!=4); //Fim laço principal
} // Fim programa
Estruturas em C 41
21.6 Estrutura: Exemplos Resolvidos
Exemplo 10 – Polinômio
Fazer um programa que leia os coeficientes de
um polinômio P(x), imprima e calcule seu
valor num ponto x (fornecido pelo usuário), e
encontre os coeficientes do polinômio Q(x).
Utilize uma função para ler o polinômio, outra
para imprimi-lo e outra para calcular o seu
valor no ponto x.
Estruturas em C 42
21.6 Estrutura: Exemplos Resolvidos
Estruturas em C 46
21.6 Estrutura: Exemplos Resolvidos
// Função que acha o polinomio Q(x)- Quociente da
//divisão de P(x)/(x-x1)
Pol calcPol(Pol px, float x)
{ //Pol pz;
int i, n = px.n;
Pol pz;
pz = px;
if (n == 0)
pz.v[0]= px.v[0];
else
{
// Usando algoritmo de Briott-Rufini.
pz.v[n-1] = px.v[n-1] + px.v[n]*x;
for (i=n-2; i >= 0; i--)
pz.v[i] = px.v[i] + x*pz.v[i-1];
pz.n = n - 1;
}
return pz;
}
Estruturas em C 47
21.6 Estrutura: Exemplos Resolvidos
Estruturas em C 48
21.6 Estrutura: Exemplos Resolvidos
Furnas
(x)
(u)
Estruturas em C 49
21.6 Estrutura: Exemplos Resolvidos
Exemplo 11 – Usinas Hidro Exemplo 11 – Usinas Hidro
#include <stdio.h> // Inicializa os dados de uma usina.
typedef struct usinaH usinaH initUsinaH(usinaH h)
{char nome[100]; float x, u; { Pol px, pu;
Pol px, pu;} usinaH; printf(“\n Entre nome da usina:”);
gets(h.nome);
// Protótipos das funções. printf(“\n Entre com volume:”);
void printUsinaH(usinaH h); scanf(“%f”,&h.x);
usinaH initUsinaH(usinaH h); printf(“\n Entre com defluencia:”);
float calcAltx(usinaH h); scanf(“%f”,&h.u);
h.px = initPol(px);
// Função principal. h.pu = initPol(pu);
main() return h;}
{ // Imprime dados de uma usina.
usinaH h; float x; void printUsinaH(usinaH h)
printf(“Iniciando usina:”); {printf(“\n Nome da usina:”);
h = initUsinaH(h); puts(h.nome);
printf(“\n Mostrando h:”); printf(“\nVolume:%f”,h.x);
printUsinaH(h); printf(“\nDefluencia:%f”,h.u);
printf(“px=%f\n”,calcAltx(h)); printf(“\n
Estruturas em C Polx = ”);printPol(h.px); 50
} printf(“\n Polu = ”);printPol(h.pu);}
21.6 Estrutura: Exemplos Resolvidos
Exemplo 11 – Usinas Hidro
// Função que calcula phi(x)
// (altura de montante).
float calcAltx(usinaH h)
{
float y;
y = calcPol(h.px, h.x);
return y;
}
Observação Importante:
A estrutura usinaH utiliza uma
outra estrutura Pol que
representa um polinômio,
bem como as funções
associadas a manipulação
da estrutura Pol. Estruturas em C 51
21.6 Estrutura: Exemplos Resolvidos
Exemplo 12 – Cadastro2
Fazer um programa que leia o nome de um
produto vendido, a data da compra, o preço da
venda e imprima todos estes valores. A seguir
imprima também um resumo da venda da
seguinte maneira:
-----------------------------------------
Resumo da venda
Produto: geladeira
Data da venda:23/10/2008
Preço do produto: R$ 2500.00
------------------------------------------
Utilize uma estrutura para armazenar os dados
dos produtos e funçõesEstruturas
para em
fazer
C
as impressões. 52
21.6 Estrutura: Exemplos ResolvidosExemplo 12 – Cadastro2
#include <stdio.h> // Função principal.
#include <stdlib.h> main()
typedef struct Data {Pd p[3]; int i;
{int D, M, A;} Dt; printf("Leitura de
typedef struct Produto produtos:");
{char Nome[100]; for (i=0; i < 3; i++)
Data Venda; { fflush(stdin);
float Preco;} Pd; p[i]=initProd();
// Protótipos das funções. fflush(stdin);
void printData(Dt d); printProd(p[i]);}
void printProd(Pd p); printf("\n\n");
Dt initData(void); system("pause");
Pd initProd(void); }
// Função principal. // Função que imprime Data.
main() void printData(Dt d)
{Pd p[3]; int i; {printf("%d/%d/%d",d.D,d.M
printf("Leitura de ,d.A);}
produtos:");
Estruturas em C 53
21.6 Estrutura: Exemplos Resolvidos Exemplo 12 – Cadastro2
Estruturas em C 55
21.7 Novos Tipos: enum
Definição
A palavra enum associa a um
Exemplo13
conjunto de nomes, valores
inteiros a partir de zero (padrão) No exemplo abaixo é criada
uma estrutura enum que
ou a partir de um primeiro valor
associa para cada palavra
fornecido. Se um valor for
um valor inteiro.
fornecido à alguns nomes e não
à outros, o compilador atribui
o próximo valor inteiro aos que enum Mes
{ Jan = 1, Fev, Mar, Abr, Mai,
não tiverem valor. Tipos enum
Jun, Jul, Ago, Set, Out,
são tratados como inteiros e
Nov, Dez
qualquer operação de números };
inteiros com eles é válida. Estruturas em C 56
21.7 Novos tipos: enum
Exemplo 13.1 – Enum Mes Exemplo 13.2 – Enum Mes
#include <stdio.h> #include <stdio.h>
enum meses {Jan = 1, Fev, Mar, enum meses {Jan = 1, Fev, Mar,
Abr, Mai, Jun, Jul, Ago, Set, Out, Abr, Mai, Jun, Jul, Ago, Set, Out,
Nov, Dez}; Nov, Dez};
main() main()
{ int dia; { int dia;
meses mes; meses mes;
mes = Set; mes = meses(9); // int -> meses !
if (mes == Jan || mes == Mar || if (mes == Jan || mes == Mar ||
mes == Mai || mes == Jul || mes == Mai || mes == Jul ||
mes == Ago || mes == Out || mes == Ago || mes == Out ||
mes == Dez) mes == Dez)
dia = 31; dia = 31;
else else
if (mes == Fev) if (mes == Fev)
dia = 28; dia = 28;
else else
dia = 30; dia = 30;
printf(“Numero dias: %d \n”,dia); } printf(“Numero
Estruturas em C dias: %d \n”,dia); } 57
21.8 Novos tipos: resumo
Fim de
Novos Tipos
Structs, Typedef e
Enum
Estruturas em C 59