LINGUAGEM: Linguagem C - Capítulo 1 - Parte 2



Declarações: Identificadores e Tipos de Dados Básicos

Objetivos:

Na primeira aula, vimos uma visão geral da linguagem C, e que um programa em C pode ser visto como uma seqüência de DECLARAÇÕES. De maneira geral, uma DECLARAÇÃO introduz um novo nome - um IDENTIFICADOR - e associa a este uma interpretação. Tome como exemplo o seguinte trecho de código:


#include <stdio.h>
double x;
void p(float b, int e) {
short int i;
x = b;
}

int main() {
p(3.1415, 5);
printf("%f",x);
return 0;
}


Na linha 1, vemos uma DECLARAÇÃO de VARIÁVEL GLOBAL. Nas linhas 3 a 8, temos uma DECLARAÇÃO de FUNÇÃO que, por sua vez, é formada por uma DECLARAÇÃO de PARÂMETROS (linha 3), uma DECLARAÇÃO de VARIÁVEL LOCAL (linha 4) e uma seqûência de comandos (linhas 5-7).

Em cada uma dessas DECLARAÇÕES um novo IDENTIFICADOR é introduzido com uma interpretação particular! Na declaração da linha 1, o IDENTIFICADOR introduzido é x e sua interpretação é VARIÁVEL GLOBAL do TIPO BÁSICO double. Na declaração das linhas 3 a 8, o IDENTIFICADOR é p e sua interpretação é FUNÇÃO que recebe como PARÂMETROS um valor do TIPO BÁSICO float e um valor do TIPO BÁSICO int; tem uma VARIÁVEL LOCAL do TIPO BÁSICO short int, executa os comandos das linhas 6-7 e ao final nada retorna ( TIPO BÁSICO void).

Note que, nesses exemplos, a interpretação dada a um IDENTIFICADOR está ligada de maneira íntima com um TIPO de DADOS BÁSICO.

Nesta aula, nosso objetivo é mostrar através de exemplos o que é um IDENTIFICADOR válido e quais são os TIPOS de DADOS BÁSICOS - os dois ingredientes fundamentais de toda DECLARAÇÃO em um programa C.

IDENTIFICADORES:

Em C, um IDENTIFICADOR é uma seqüência de LETRAS ou DÍGITOS onde:
  • O primeiro caracter deve ser uma LETRA ( 'a',...,'z','A',...,'Z','_' )
    • O caracter '_' é contado como uma LETRA
  • LETRAS maiúsculas (e.g., 'A') são consideradas diferentes de letras minúsculas (e.g., 'a')
    • isto implica que o IDENTIFICADOR aux é diferente de Aux que é diferente de AUX
  • PALAVRAS RESERVADAS tais como if, else, char, int, ... não podem ser usadas como IDENTIFICADORES.

Pelo padrão C ANSI, um IDENTIFICADOR pode ter qualquer tamanho.

Observações:
  • Para IDENTIFICADORES INTERNOS (i.e., nomes restritos a uma única UNIDADE de COMPILAÇÃO), pelo menos os primeiros 31 caracteres são significativos; algumas implementações podem utilizar um conjunto maior de caracteres significativos.
  • Já os IDENTIFICADORES EXTERNOS (i.e., nomes de de VARIÁVEIS GLOBAIS e FUNÇÕES compartilhados entre várias UNIDADES de COMPILAÇÃO) são mais restritos: as implementações podem considerar em casos extremos apenas 6 caracteres como significativos, e podem ignorar as distinções entre letras maiúsculas e minúsculas.

Atividade 1: Validando Indentificadores :

Vamos escrever um programa em C (id.c) que dado uma palavra (cadeia de caracteres) imprima na tela é um identificador! ou não é um identificador! caso a palavra obedeça ou não a definição de identificador dada acima.

DICA - comece o programa assim:


#include <stdio.h>
char str[80]; /* armazena uma cadeia de até 79 caracteres */
int main() {
printf("Digite uma palavra: ");
scanf("%s", str); /* le do usário uma cadeia de caracteres */
...
}

TIPOS DE DADOS BÁSICOS:

Há cinco tipos de dados básicos em C:
  • char : um único byte, capaz de conter um caracter no conjunto de caracteres local;
  • int : um inteiro, normalmente refletindo o tamanho natural dos inteiros da máquina hospedeira;
  • float : ponto flutuante em precisão simples;
  • double : ponto flutuante em dupla precisão;
  • void : conjunto vazio de valores.
Todos os outros tipos de dados em C são baseados em um desses tipos básicos.

Modificadores:

Exceto void, os tipos de dados básicos podem ter vários MODIFICADORES precedendo-os. Um MODIFICADOR é usado para alterar o significado de um tipo básico para adaptá-lo à necessidade de diversas situações.
São MODIFICADORES de tipos:
long
short
signed
unsigned
  • short ou long - referem-se a diferentes tipos de inteiros:
    • A palavra int pode ser omitida e normalmente o é!
      • short = short int
      • long = long int
    • Obs.:
      • Alguns compiladores permitem long long int ! (Fora do Padrão ANSI)
    • long pode também ser aplicado a double de tal modo que:
      • floatdoublelong double
  • signed ou unsigned - podem ser aplicados a char, ou a short ou long ( int ).
    • Equivalencias
      • char = signed char ou char = unsigned char, a depender da máquina hospedeira;
      • signed int = int = signed
      • signed long = long
      • signed short = short
      • unsigned int = unsigned
    • Obs.:
      • Alguns compiladores podem permitir unsigned double ! (Fora do Padrão ANSI)

Tamanho e Faixa de Valores:

O tamanho e faixa de valores dos tipos básicos de dados variam de acordo com:
  • tipo do processador
  • implementação do compilador
No entanto, o padrão ANSI C estipula valores mínimos:

Atividade 2: Explorando <limits.h>:

Nos arquivos de cabeçalho <limits.h> e <float.h> encontram-se definidas constantes simbólicas para a faixa de valores e tamanho em bytes dos tipos de dados básicos e modificados da linguagem C, conforme foram implementados em um dado compilador/máquina.

Nesta atividade, o seu objetivo é escrever um programa tipos.c que inclua os arquivos de cabeçalho <limits.h> e <float.h> e imprima - para os tipos mostrados na tabela 2.1 - as seguintes informações :
TIPO                    VALOR_MIN               VALOR_MAX       TAMANHO em BYTES
char                    -128                    127             1
unsigned char           0                       255             1
signed char             -128                    127             1
...

Como ponto de partida, você pode iniciar o seu programa assim:

#include <limits.h>
#include <float.h>
char c;
unsigned char uc;
signed char sc;
int i;
...
int main(void) {
printf("TIPO\t\t\tVALOR_MIN\t\tVALOR_MAX\tTAMANHO em BYTES\n");
printf("char\t\t\t%i\t\t\t%i\t\t%i\n", CHAR_MIN, CHAR_MAX, sizeof c);
printf("unsigned char\t\t%i\t\t\t%i\t\t%i\n", 0, UCHAR_MAX, sizeof uc);
printf("signed char\t\t%i\t\t\t%i\t\t%i\n", SCHAR_MIN, SCHAR_MAX, sizeof sc);
...
}

Leitura Recomendada:


Para detalhes sobre representacao de caracteres:
Para detalhes sobre representação de números:
Para detalhes sobre o padrão ANSI C:

Exercícios:

  1. Faça por completo a atividade 1
  2. Faça por completo a atividade 2
  3. Utilizando os TIPOS inteiros em C, escreva programas para:
    1. Dado um número inteiro positivo n, calcular a soma dos n primeiros números naturais.
    2. Dado um número inteiro positivo n, imprimir os n primeiros naturais ímpares.
      • Exemplo: Para n=4 a saída deverá ser 1,3,5,7.
    3. Dados n e dois números inteiros positivos i e j diferentes de 0, imprimir em ordem crescente os n primeiros naturais que são múltiplos de i ou de j e ou de ambos.
      • Exemplo: Para n = 6 , i = 2 e j = 3 a saída deverá ser : 0,2,3,4,6,8.
    4. Dizemos que um número natural é triangular se ele é produto de três números naturais consecutivos. Exemplo: 120 é triangular, pois 4.5.6 = 120. Dado um inteiro não-negativo n, verificar se n é triangular.
    5. Dado um inteiro positivo p, verificar se p é primo.
    6. Dados três números naturais, verificar se eles formam os lados de um triângulo retângulo.
  4. Utilizando os TIPOS ponto flutuante em C, faça programas para os seguintes enunciados:
    1. Um programa que leia uma temperatura em graus celsius e a converta para fahrenheit.
    2. Uma pessoa aplicou um capital de x complexos (1) a juros mensais de z durante 1 ano. Deseja-se um programa que determine o montante de cada mês durante este período.
    3. Dados números reais a, b e c, calcular as raízes de uma equação do 2o grau da forma ax^2 + b^x + c = 0.
  5. Utilizando o TIPO char, re-escreva os programas anteriores para ao final perguntar ao usário: deseja processar outro valor? [s/n]. Se o usuário digitar 's' ou 'S' o programa deve continuar processando uma nova entrada; caso contrário deve terminar.
Bibliografia e fonte:

  • [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
  • LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
  • [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
  • DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
  • Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.