Aula Teórica 1b: variáveis e tipo de dados em C Departamento de Informática, UBI
Variáveis: conceito e pratica Variáveis e linguagens de programação A memoria A majoria dos linguagens de programação são baseados na mesma técnica: a manipulação dos valores conteúdos em uma variável Em programação, uma variável é um nome atribuído a um espaço da memoria (central) do computador E importante compreender que não é o programador que escolha o espaço, seja o endereço na memoria O programador só declara que precisa de um espaço escolhendo um nome qualquer Mais atenção: o nome escolhido e importante para o(s) programador(es)!
Variáveis: conceito e pratica Variáveis e linguagens de programação Exemplos de escolha errada do nome de uma variável A caso: fnskdlfn Ninguém compreende Só para mim: fofinha O que acontece se quero a ajuda de um outro programador? Críptica: ex-nop-b1-ife Esta é uma pratica usual para ganhar tempo escrevendo o programa, mais no nal precisa de algumas regras para concordar sobre o signicado Ambígua: comprimento Há dois programadores de um sistema de gestão de docas: um acredita que o comprimento de um barco é em pés, o outro que é em metros! Solução: declarar comprim-pes (assim é em náutica)
Variáveis: conceito e pratica Variáveis e linguagens de programação Variáveis versus constantes O termine variável sugere que este espaço da memoria deveria ser destinado a registrar uma mutação de valores durante a computação Exemplo: variável saldo para gravar o conteúdo efectivo em euro do vosso conto bancário Inciso: sabiam que não e possível depositar uma moeda diferente no vosso (mesmo) conto? Que sejam as razoes, se isto fosse possível seria categórico resolver as ambiguidades da variável saldo. Ideias? Mais os programadores precisam também de espaço para gravar informação que não muda Exemplos: local-nascimento, pi para gravar o numero 3.14159, ensino-primario para gravar sim o não - esta é uma constante se o programa só considera adultos
Variáveis: conceito e pratica Variáveis e linguagens de programação Variáveis versus constantes E uma boa pratica não declarar como variável um endereço que não deve mudar de valores durante a computação E porque? Porque em programação faz sentido seguir uma lógica. Isso é de bastante ajuda quando o programa tem um comportamento inesperado Exemplo de erro: declarar uma variável root para gravar root, o nome do administrador de sistema Infelizmente, um erro de programação pode mudar o conteúdo da root e comprometer o sistema. Quando acontece, e difícil descobrir as razoes de estes erros Solução: declarar root como uma constante
Tipos: o que são? Para que servem Tipos de dados de uma variável Diferencias na informação Em informática, e noção comum que a informação - pode ser em forma de cheiros - tem formatos diferentes Exemplo: isto e o resultado de abrir a imagem conteúda no cheiro arduino.png com o editor de texto
Tipos: o que são? Para que servem Tipos de dados de uma variável Números e strings O tipo de uma variável fala de isso, e de muito mais No caso mais intuitivo, o tipo permite de distinguir os números das strings. A declaração: string nome-utente signica que a variável nome-utente contem uma string A declaração: int idade signica que a variável idade contem um numero inteiro Intuitivamente, isto signica que não posso trocar os valores das variaveis entre ilhes porque são de natura diferente O tipos servem para impedir erros de esta natura nos programas
Tipos: o que são? Para que servem Inciso: funções e operações Um esclarecimento (to be on the safe side) Em matemática, uma função f é denotada na seguinte maneira: f : X Y X é o domínio, Y e o contradomínio Quando f é total cada elemento de X e associado a um elemento de Y, denotado: f (x) = y x e o argumento, y e o valor da função no x Exemplo: square: R R + Uma função e uma operação quando X = Y : f : X X Exemplo: next: N N Na teoria dos tipos, são especialmente as operações que interessam
Tipos: o que são? Para que servem Tipos de dados de uma variável A abstracção de tipo O tipo de uma variável indica uma colecção de operações que pode ser efectuadas sobre o conteúdo da variável.indica também as limitações dos valores que podem ser gravados Sao estas operações que descrevem a semântica dos valores de um dado tipo Exemplo: os axiomas de Peano que denem os números naturais podem ser derivados a partir da função sucessor (cf. von Neumann) As limitações também são importantes No ano 1996 o foguete Ariane 5, lançado no espaço para a primeira vez, explodiu depois 40. Foi depois descoberto um ($500-million) erro gerado da o tentativo de por em uma variável integer de 16 bit um valor mais grande
Tipos: o que são? Para que servem C: uma linguagem de programação tipicada Papel dos tipos Um tipo representa um conjunto nito de valores.tem associado: um nome (palavra reservada do C), um conjunto de literais, que denotam as constantes do conjunto que representa, um conjunto de operações, que recebendo argumentos do tipo devolvem resultado desse tipo. Exemplo: int n; E possível utilizar a função abs com argumento n para calcular o valor absoluto de n O C tem um conjunto de tipos de dados disponíveis (ditos primitivos) e suporta a denição de tipos pelo programador.
Tipos numéricos Tipos primitivos do C Os tipos de dados primitivos são void designa a ausência de valor. Usa-se em funções sem parâmetros (domínio vazio) ou que não devolvem nada (contradomínio vazio). Inteiros, que compreendem 3 subtipos: int representa um conjunto de valores inteiros; um valor é codicado com pelo menos 16 bits (2 bytes), mas pode ter mais (32 ou mesmo 64 nas arquitecturas típicas de hoje); bool representa o conjunto dos valores lógicos true e false (internamente, 1 e 0); um valor é codicado com 1 byte. char representa um conjunto de caracteres; um valor é codicado com pelo menos 1 byte. Reais (float), que representa um conjunto de valores reais; um valor é codicado com pelo menos 4 bytes. Complexos (complex), que representa um conjunto de valores complexos; um valor é codicado com pelo menos 6 bytes.
Tipos inteiros Tipos de valores inteiros do C O tipo bool É o tipo dos valores lógicos, ou booleanos (Boole foi um lógico). Os literais true e false são representados pelos valores inteiros 1 e 0. As operações disponíveis são: lógicas (recebem booleanos e devolvem booleanos): negação! (NOT), disjunção (OR) ou conjunção && (AND) relacionais (recebem valores numéricos e devolvem booleanos): <, >, <=, >=, ==,! =
Tipos inteiros Tabela verdade A mais básica tabela para a álgebra de Boole e a seguinte: Para formulas mais complexas e bem devolver uma tabela ad-hoc para ser seguros que a formula descreve a condição intendida
Tipos inteiros Tabela verdade Tabela de Boole para a formula do código Regras para uma correcta compreensão de uma formula: 1 Fazer atenção e por parênteses para evitar ambiguidades a && (b c) e diferente da a && b c 2 Escrever a tabela para todos os casos a = 0, 1, b = 0, 1, c = 0, 1 (quantos são?) Talvez, a tabela permite de simplicar a formula Exemplo: considerem a formula: a && (b c) &&!(c a) Esta formula e equivalente a false Porque?
Tipos inteiros Tipos de valores inteiros do C Qualicadores Há dois tipos de qualicadores de tipos em C: de sinal (signed ou unsigned); e de comprimento (short, long ou long long). Cada tipo qualicado denota um conjunto de valores. Tipos char O tipo inteiro char contém, se o compilador usar 1 byte para codicar valores do tipo, 2 8 = 256 valores. Cada valor numérico corresponde a um caracter, de acordo com uma tabela (por exemplo, a ASCII). Pode ter associado um qualicador de sinal; por defeito, char é unsigned e denota o conjunto {0,..., 255}; signed char é o conjunto { 128,..., 127}. Exemplos de literais caracteres: '\n', '!', 'A', 'Z', 'a', 'z', '_'
Tipos inteiros Tipos de valores inteiros do C Tipos int O tipo de dados inteiro int pode ter associados os dois tipos de qualicadores. Há portanto 6 tipos (2x3) int: signed ou unsigned short int; signed ou unsigned long int; signed ou unsigned long long int. Por defeito, int é signed (sem qualicador de comprimento). O tipo dos naturais é unsigned int
Tipos inteiros Tipos de valores inteiros do C Tipos int: alguns conjuntos denotados Assumindo 2 bytes para um short int, tem-se: short (signed short int): { 32768,..., 32767} int (signed int): { 2147483648,..., 2147483647} long long int: { 9223372036854775808,..., 9223372036854775807} Operações (aritméticas): adição +, subtracção -, multiplicação *, divisão (inteira) /, resto da divisão %. Os conjuntos de valores são percorridos circularmente: se uma operação dá um valor que extravaza os limites do conjunto, o resultado está no extremo oposto, na posição correspondente aos valores em que se ultrapassou o limite. Exemplo: no tipo short tem-se que 32768 2 = 32766 e 32766 + 2 = 32768
Tipos inteiros Tipos de valores reais do C Tipos float e double Os tipos de dados reais admitem um uso limitado dos qualicadores. Há 3 tipos reais: float, double ou long double. Um valor do tipo float é representado com no mínimo 4 bytes e 6 dígitos de precisão. Um valor do tipo double é representado com no mínimo 8 bytes e 16 dígitos de precisão. Um valor do tipo long double é representado com no mínimo 10 bytes e 20 dígitos de precisão. Exemplos de literais: 3.14159, 12.3e56, -1e-2, 12.0, etc. Operações: aritméticas (adição, subtracção, multiplicação e divisão), trigonométricas, logaritmicas, etc.
A motivação do utilizo dos tipos Redo from start: a que serve isso? A ajuda na prevenção dos erros A impedir erros de programação causados da uma confusão na tipologia dos dados Exemplo básico: void x(); O tentativo de efectuar a operação x()+1 da erro! O que signica dar erro? Signica que um programa que contem esta operação nao compila. A consequência é que não e possível executar esta operação no sistema, porque é errada e pode ser perigosa para todo o sistema Mais notam que estes erros, ainda os mais básicos, acontecem na pratica da programação!
A motivação do utilizo dos tipos Tipo void e erros stackoverflow.org I'm having trouble compiling some C code. When I compile, I get this error: player.c: In function login: player.c:54:17: error: void value not ignored as it ought to be This is the code of the error (segue o codigo). Any way to bypass this kind of error? (Answer): sp-err = sp-session-login(sess, username, password, remember-me); I guess sp-session-login is returning void