Escolar Documentos
Profissional Documentos
Cultura Documentos
int main()
{
struct Aluno Jose; /* Declara uma varivel do tipo struct Aluno */
Jose.nmat = 456;
Jose.nota[0]= 7.5;
Jose.nota[1]= 5.2;
Jose.nota[2]= 8.4;
Jose.media = (Jose.nota[0] + Jose.nota[1] + Jose.nota[2])/3.0;
system("PAUSE");
return 0;
}
Definindo a estrutura
A definio da estrutura informa como ela organizada e quais so os seus
membros
Palavra-chave
Etiqueta
struct Aluno
{
int nmat;
Chaves float nota[3]; Membros
float media;
};
Ponto-e-vrgula
int main()
{
struct Aluno /*Inicio da definio da estrutura */
{
int nmat; /* Nmero da matrcula */
float nota[3]; /* Notas */
float media; /* Mdia */
}; /* Fim da definio */
Jose.nmat = 456;
Jose.nota[0]= 7.5;
Jose.nota[1]= 5.2;
Jose.nota[2]= 8.4;
Jose.media = (Jose.nota[0] + Jose.nota[1] + Jose.nota[2])/3.0;
system("PAUSE");
return 0;
}
Novos nomes para os tipos existentes: typedef
Declaraes com typedef no produzem novos tipos de dados, apenas
criam novos nomes (sinnimos) para os tipos existentes
Sintaxe
typedef tipo-existente sinnimo;
int main()
{
BYTE ch; /* Declara uma varivel do tipo BYTE */
uint x; /* Declara uma varivel do tipo uint */
unsigned char chmm; /* Os tipos originais podem ser usados */
Usando typedef com struct
Com estruturas, podemos utilizar typedef de trs formas
struct Aluno
{
int nmat;
float nota[3];
float media;
};
typedef struct Aluno Aluno;
Aluno Jose; /* Declara uma varivel do tipo Aluno */
A instruo
Jose.nmat = 456;
atribui o valor 456 ao membro nmat da varivel Jose
Por exemplo, Jose.nmat o nome de uma varivel do tipo int e pode ser
utilizada em todo lugar em que se use variveis desse tipo
Combinando declaraes
No exemplo anterior, definimos a estrutura e declaramos a varivel em
duas instrues distintas
Andre = aniversrio;
typedef struct
{
int peas;
float preo;
} Venda;
typedef struct
{
int dia;
char mes[10];
int ano;
} Data;
typedef struct
{
int pecas;
float preco;
Data diavenda;
} Venda;
int main()
{
static Venda A = { 20, 110.0, {7,"Novembro",2001} };
Logicamente, esse processo no pra nesse nvel; podemos ter uma estrutura
dentro de outra quanta vezes desejarmos
Inicializando estruturas aninhadas
A varivel A foi inicializada na instruo
int main()
{
Venda A, B, Total;
printf("Venda A\n=======\n");
printf("Insira o numero de pecas: ");
scanf("%d", &A.pecas);
printf("Insira o preco: ");
scanf("%f", &A.preco);
printf("\nVenda B\n=======\n");
printf("Insira o numero de pecas: ");
scanf("%d", &B.pecas);
printf("Insira o preco: ");
scanf("%f", &B.preco);
Total = TotalVendas( A,B);/* Estruturas como argumento e retorno */
printf("\n\nVenda Total\n===========");
printf("\nTotal de pecas: %d" , Total.pecas );
printf("\nPreco total : %.2f\n" , Total.preco );
A funo cria as novas variveis C e D para conter cpia dos valores das
variveis A e B de main( ), enviadas como argumento
Assim seria feito com qualquer tipo de varivel simples passada por valor
#define ESC 27
#define TRUE 1
typedef struct
{
int dia;
char mes[10];
int ano;
} Data;
typedef struct
{
Data diavenda;
int pecas;
float preco;
} Venda;
int n=0;
int main()
{
char ch;
while(TRUE)
{
printf("Digite E para entrar uma venda\n");
printf(" L para listar as vendas\n");
printf(" ESC para terminar\n");
ch=getche();
printf("\n");
switch(ch)
{
case 'E':
novavenda();
break;
case 'L':
listavenda();
break;
case ESC: /* ESC no pode ser declarado com const */
exit(0);
default :
printf("Opcao invalida!!\n");
}
}
system("PAUSE");
return 0;
}
Cont. exemplo
}
system("PAUSE");
return 0;
}
void novavenda()
{
char temp[80];
printf("Dia: "); gets(temp);
vendas[n].diavenda.dia=atoi(temp);
printf("Mes: "); gets(vendas[n].diavenda.mes);
printf("Ano: "); gets(temp);
vendas[n].diavenda.ano=atoi(temp);
printf("Pecas: ");gets(temp);
vendas[n].pecas=atoi(temp);
printf("Preco: ");gets(temp);
vendas[n].preco=atof(temp);
Total.pecas += vendas[n].pecas;
Total.preco += vendas[n++].preco;
}
void listavenda()
{
int i;
if(!n)
{
printf("Lista vazia.\n");
return;
}
printf("\n\nRelatorio\n");
for (i=0; i<n; i++)
{
printf("%2d de %10s de %4d", vendas[i].diavenda.dia,
vendas[i].diavenda.mes, vendas[i].diavenda.ano);
printf("%10d", vendas[i].pecas);
printf("%20.2f\n", vendas[i].preco);
}
printf("\nTotal");
printf("%29d", Total.pecas);
printf("%20.2f\n\n", Total.preco);
}
Declarando a matriz de estruturas
O processo de declarao de uma matriz de estruturas perfeitamente
anlogo ao de declarao de qualquer tipo de matriz
A instruo
Venda vendas[50];
declara vendas como sendo uma matriz de 50 elementos
typedef struct
{
unsigned short CodAscii: 8; /* Bits 0 a 7 */
unsigned short CorFrente: 3; /* Bits 8 a 10 */
unsigned short Intenso: 1; /* Bits 11 */
unsigned short CorFundo: 3; /* Bits 12 a 14 */
unsigned short Piscante: 1; /* Bits 15 */
} Int16Bits;
int main()
{
Int16Bits A;
A.CodAscii = 'A';
A.CorFrente = 3; /* Branco para a cor de frente */
A.Intenso = 1; /* Intensifica a cor de frente */
A.CorFundo = 0; /* Preto para a cor de fundo */
A.Piscante = 1; /* Escolhe atributo piscante */
...
As funes atoi( ) e atof( )
A funo atoi( ), com prottipo no arquivo stdlib.h, recebe o endereo
de uma string como argumento e o converte para um valor inteiro
Caso a string no contenha um nmero vlido, ela retornar zero
Espaos em branco iniciais so ignorados
enum Mes {Jan=1, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez};
int main()
{
enum Mes m1, m2, m3; /* Cria duas variveis do tipo enum Mes */
A palavra enum
Define um conjunto de nomes (cada um deles com um valor inteiro)
Enumera esses nome a partir do zero (defaut) ou, como em nosso programa, a
partir do primeiro valor fornecido
Tipos de dados enumerados: enum
enum Mes {Jan=1, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez};
int main()
{
enum Mes m1, m2, m3; /* Cria duas variveis do tipo enum Mes */
int main()
{
Mes m1, m2, m3; /* Agora o nome do tipo Ms */
Outro exemplo
typedef enum {Feminino, Masculino} sexo;
typedef enum {OFF, ON} chave;
Palavra-chave
Etiqueta
union Facil
{
short x;
Chaves char nota[2]; Membros
float ff;
};
Ponto-e-vrgula
/* Union1.C */
/* Mostra o uso de unies */
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* Para strcpy() */
union Numero
{
char str[30];
int i;
float f;
};
enum DataType
{
StrType, IntType, FloatType
} Tipo; /* Cria varivel */
void Print()
{
switch(Tipo)
{
case StrType:
printf("Str = %s\n", x.str);
break;
case IntType:
printf("Int = %d\n", x.i);
break;
case FloatType:
printf("Float = %.2f\n", x.f);
break;
}
}
int main()
{
float y = 34.56;
int z = 345;
StrTipo("VVB-Treinamento de Pessoal");
Print();
IntTipo(z);
Print();
FloatTipo(y);
Print();
system("PAUSE");
return 0;
}
Usando typedef com union
A sintaxe de union a mesma de struct
Assim, podemos utilizar typedef
typedef union
{
char str[30];
int i;
float f;
}Numero;
/* Inicializao permitida */
static union
{
float salario; /* Deve ser definido primeiro*/
int idade;
}uInit = {123.456};
Unies de estruturas
Uma unio pode ter membros de qualquer tipo, at mesmo estruturas ou
outras unies
Uma unio tambm pode ser membro de uma estrutura
/* UnionStruct.C */
/* Mostra unio de estruturas */
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
struct doisint
{
int n1;
int n2;
};
union intflo
{
struct doisint x;
float f;
}unex;
unex.f = 345.22;
system("PAUSE");
return 0;
}
Unies de estruturas
Observe que o operador ponto foi usado duas vezes para acessar os
membros da estrutura interna x
typedef struct
{
/* cada membro com um bit de tamanho */
unsigned char bit0: 1; /* bit 0 */
unsigned char bit1: 1; /* bit 1 */
unsigned char bit2: 1; /* bit 2 */
unsigned char bit3: 1; /* bit 3 */
unsigned char bit4: 1; /* bit 4 */
unsigned char bit5: 1; /* bit 5 */
unsigned char bit6: 1; /* bit 6 */
unsigned char bit7: 1; /* bit 7 */
} Bits;
typedef union
{
unsigned char ch;
Bits x;
} Binario;
int main(void)
{
Binario B;
printf("Digite um caractere: ");
B.ch = getchar();
printf("O caractere digitado e: %c\n", B.ch);
printf("O valor em binario correspondente e: ");
printf("%d", B.x.bit7);
printf("%d", B.x.bit6);
printf("%d", B.x.bit5);
printf("%d", B.x.bit4);
printf("%d", B.x.bit3);
printf("%d", B.x.bit2);
printf("%d", B.x.bit1);
printf("%d", B.x.bit0);
printf("\n");
system("pause");
return 0;
}
O operador sizeof
Uma varivel se um tipo union tem o tamanho do maior membro
Para verificar isso, usaremos um novo operador C sizeof
O sizeof opera sobre o nome de um tipo de dado ou sobre o nome de
uma varivel e resulta o seu tamanho em bytes
/* Sizeof.C */
/* Mostra o uso do operador sizeof() */
#include <stdio.h>
#include <stdlib.h>
union Numero
{
char str[32];
int i;
float f;
} x; /* Cria varivel */
int main(void)
{
printf("%d\n", sizeof(union Numero));
printf("%d\n", sizeof(x));
system("PAUSE");
return 0;
}
O operador de endereos (&) com union
O endereo de memria de cada membro de uma unio o mesmo, visto
que todos compartilham o mesmo espao
Podemos verificar isso utilizando o operador de endereos
/* Endereco.C */
/* Mostra o uso do operador de endereo */
#include <stdio.h>
#include <stdlib.h>
typedef union
{
int i;
float f;
double d;
} Num;
int main(void)
{
Num exemplo;
system("PAUSE");
return 0;
}
Unies annimas
So definidas sem a especificao do nome do tipo
Veja o exemplo a seguir
/* UnionAn.C */
/* Mostra o uso de unies annimas */
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* Para strcpy() */
typedef struct
{
enum DataType Tipo;
union
{
char str_valor[30];
int int_valor;
float float_valor;
};
} UniaoLiteral;
void Print(UniaoLiteral);
int main()
{
UniaoLiteral A;
A.Tipo=StrType;
strcpy(A.str_valor, "VVB-Treinamento de Pessoal");
Print(A);
A.Tipo=FloatType;
A.float_valor=34.56;
Print(A);
A.Tipo=IntType;
A.int_valor=345;
Print(A);
system("PAUSE");
return 0;
}
void Print(UniaoLiteral x)
{
switch(x.Tipo)
{
case StrType:
printf("Str = %s\n",x.str_valor);
break;
case IntType:
printf("Int = %d\n",x.int_valor);
break;
case FloatType:
printf("Float = %.2f\n",x.float_valor);
break;
}
}
Unies annimas
Em C, unies annimas s podem ser definidas como membros de
estruturas