Programação 11543: Engenharia Informática 6638: Tecnologias e Sistemas de Informação Cap. 3 Tipos de Dados Simples Tipos de Dados Simples
Objectivos: Hierarquia de tipos de dados Tipos de dados simples Tipos de dados compostos Tipos de dados definidos pelo utilizador A utilização de typedef na construção de novos tipos de dados
Taxonomia de tipos de dados Tipos de Dados void Tipos Simples Tipos Compostos Tipos Numéricos Tipos Apontadores * Tipos Enumerados Tipos Inteiros Tipos Reais enum char int float double
Classificação de tipos de dados simples (TDS) Há 3 classes de TDS: Numéricos pré-definidos: char, int, float, double pertencem ao léxico da linguagem Apontadores definidos pelo utilizador não pertencem ao léxico da linguagem requer a utilização do símbolo * Enumerados definidos pelo utilizador não pertencem ao léxico da linguagem requer a utilização da palavra reservada enum Consoante o contexto, o símbolo * pode ter as seguintes utilizações: Definição de tipos apontadores Declaração de variáveis apontadoras Operador de multiplicação Operador de valoração
Características dos TDS Atomicidade têm valor atómico Exemplo (inteiros): int x = 31; Ordem têm uma ordem ou escala Exemplo (inteiros): 20 < 31 < 35 < 36
Qualificadores de TDS Qualificadores de comprimento (nº de bytes) short long Exemplos: short int x; long float y; Qualificadores de sinal signed unsigned Exemplos: signed int w; unsigned int z;
Formatos de leitura/escrita tipo formato descrição char %c um único carácter int %d ou %i um inteiro (base decimal) int %o um inteiro (base octal) int %x ou %X um inteiro (base hexadecimal) short int %hd um inteiro curto (base decimal) long int %ld um inteiro longo (base decimal) unsigned short int %hu um short inteiro positivo unsigned int %u um inteiro positivo unsigned long int %lu um inteiro positivo longo float %f ou %e ou %E um real de precisão simples double %f ou %e ou %E um real de precisão dupla
Tipos de dados inteiros: char e int Uma variável do tipo char armazena um valor inteiro de 1 byte, podendo ser usada para guardar um carácter ou um inteiro. Exemplos: char c; c = A ; /* estas instruções são equivalentes */ c = 65; //---------------------------- char a, b; a = 5; /* a contém o valor 5 */ b = 5 ; /* b contém o valor 53 na tabela ASCII */
Formatos de dados do tipo char /* Escreve no ecrã o valor char dum carácter */ #include <stdio.h> int main() { char ch; printf( Escreva um caracter: ); scanf( %c,&ch); printf( O seu valor char = %c\n,ch); return 0; } /* Escreve no ecrã o valor inteiro dum carácter */ #include <stdio.h> int main() { char ch; printf( Escreva um caracter: ); scanf( %c,&ch); printf( O seu valor numerico = %d\n,ch); return 0; } Formato de caracteres Formato de inteiros
Tipos de dados reais: float e double O tipo de dados float é para números reais de precisão simples (4 bytes). O tipo de dados double é para números reais de precisão dupla (8 bytes). Exemplos: float x, y, z, w, t; x = 0.345; y =.67; z = 89.; w = 6.2E+5; /* notação científica: representa 6.2 x10 5 */ t = 3.5E-4; /* notação científica: representa 3.5 10-4 */ //---------------------------- double a; a = 5.23456789;
Valor de uma variável Endereço de uma variável valor de j memória endereço de j j 1 248623 #include <stdio.h> int main() { int j = 1; printf("o valor de j = %d\n",j); printf("o endereco de j = %d\n",&j); return 0; } Saída no ecrã: O valor de j = 1 O endereco de j = 248623
Tipos de dados apontadores: char*, int*, float*, double* Qualquer variável apontadora contém um valor (inteiro) que é um endereço de memória. Exemplo: float j = 1.2; float *p; p = &j; memória valor de j endereço de j j 1.2 1342167 p 1342167
Exemplo: float* valor de j memória endereço de j j 1.2 1342167 p 1342167 #include <stdio.h> int main() { float j = 1.2; float *p; } p = &j; /* atribui o endereço de j a p */ printf("o valor de j = %f\n",j); printf("o endereco de j = %d\n",p); return 0; Saída no ecrã: O valor de j = 1.2 O endereco de j = 1342167
Acesso ao valor de uma variável Há duas formas de ler (aceder a) o valor duma variável em memória: Leitura directa (ou acesso directo). Utiliza-se o nome da variável. Leitura indirecta (ou acesso indirecto). Utiliza-se operador de valoração * seguido de nome de variável apontadora. Exemplo: O acesso ao valor 1.2 de j faz-se através do uso: da variável j da variável p que aponta para j valor de j memória endereço de j j 1.2 1342167 p 1342167
Exemplo: valor de j memória endereço de j j 1.2 1342167 p 1342167 #include <stdio.h> int main() { float j = 1.2; float *p; acesso DIRECTO ao valor de j acesso INDIRECTO ao valor de j } p = &j; /* atribui o endereço de j a p */ printf("o valor de j = %f\n",j); /* acesso directo ao valor de j */ printf("o valor de j = %f\n",*p); /* acesso indirecto ao valor de j */ return 0; Saída no ecrã: O valor de j = 1.2 O valor de j = 1.2
Tipos de dados enumerados A linguagem C não tem propriamente tipos de dados enumerados pré-definidos. O que a linguagem C oferece é um operador enum que permite definir tipos de dados enumerados; por exemplo: enum cor, enum dia, etc. Às vezes, por uma questão estética, faz-se o mascaramento dum tipo de dados enumerados através da directiva typedef. Têm também uma ordem! Exemplos: enum cor {red, blue, green, yellow}; enum dia {domingo, 2f, 3f, 4f, 5f, 6f,sabado}; enum fruta {apple, orange=10, lemon}; enum boolean {FALSE, TRUE};
Exemplo: #include <stdio.h> enum boolean {FALSE,TRUE}; int main() { enum boolean b; int x=3,y=2; b = x > y; } printf( O valor de b = %d",b); return 0; Saída no ecrã: O valor de b = 1
Exemplo: c/ typedef #include <stdio.h> #typedef enum {FALSE,TRUE} boolean; int main() { boolean b; int x=3,y=2; b = x > y; } printf( O valor de b = %d",b); return 0; Saída no ecrã: O valor de b = 1
Nota importante Ao contrário de grande parte das linguagens, a linguagem C não tem explicitamente o tipo de dados boolean. Foi por isso que o criámos no exemplo anterior. No entanto, a linguagem admite expressões lógicas, e, como tal, há sempre cálculo de expressões lógicas cujo resultado é ou falso ou verdadeiro. Em C, o valor falso duma expressão lógica é o valor 0, ao passo que o valor verdadeiro é 1. É, por isto, que o resultado 1 (verdadeiro) da expressão x>y no exemplo anterior pode ser atribuído à variável b. A variável b só admite dois valores possíveis: 0 (FALSE) e 1 (TRUE).
Sumário: Classificação de tipos de dados Classificação de tipos de dados simples Características de tipos de dados simples Qualificadores de comprimento e de sinal de tipos de dados simples Tipos de dados inteiros Tipos de dados reais Inicialização de variáveis Valor de / endereço de variável Tipos de dados apontadores Acessos directo e indirecto a valor duma variável Tipos de dados enumerados A directiva typedef