Programação 11543: Engenharia Informática 6638: Tecnologias e Sistemas de Informação Cap. 3 — Tipos de Dados Simples 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 Tipos de Dados Simples Taxonomia de tipos de dados Tipos de Dados void Tipos Numéricos Tipos Simples Tipos Compostos Tipos Apontadores Tipos Enumerados * Tipos Inteiros char int Tipos Reais float double enum Tipos de Dados Simples 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 Tipos de Dados Simples 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 Tipos de Dados Simples 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; Tipos de Dados Simples 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 Simples 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 */ Tipos de Dados Simples Formatos de dados do tipo char Formato de caracteres /* 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 inteiros Tipos de Dados Simples 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 x105 */ t = 3.5E-4; /* notação científica: representa 3.5´10-4 */ //---------------------------double a; a = 5.23456789; Tipos de Dados Simples Valor de uma variável Endereço de uma variável memória valor de j endereço de j j 1 #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 248623 Tipos de Dados Simples 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 p 1342167 1342167 Tipos de Dados Simples Exemplo: float* memória valor de j endereço de j j 1.2 1342167 p 1342167 #include <stdio.h> int main() { float j = 1.2; float *p; p = &j; 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 /* atribui o endereço de j a p */ Tipos de Dados Simples 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 memória valor de j endereço de j j 1.2 p 1342167 1342167 Tipos de Dados Simples Exemplo: memória valor de j endereço de j j 1.2 1342167 p 1342167 #include <stdio.h> int main() { float j = 1.2; float *p; p = &j; printf("O valor de j = %f\n",j); printf("O valor de j = %f\n",*p); return 0; } Saída no ecrã: O valor de j = 1.2 O valor de j = 1.2 acesso DIRECTO ao valor de j acesso INDIRECTO ao valor de j /* atribui o endereço de j a p */ /* acesso directo ao valor de j */ /* acesso indirecto ao valor de j */ Tipos de Dados Simples 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}; Tipos de Dados Simples 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 Tipos de Dados Simples 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 Tipos de Dados Simples 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). Tipos de Dados Simples 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