Contents

Capítulo 2 - Programação Básica em C


botões
botões Conteúdo Capítulo anterior Capítulo seguinte

Neste capítulo são apresentados os aspetos básicos dos programas em C, tais como a sua estrutura, a declaração de variáveis, os tipos de dados e os operadores.


Tópicos

setas
setas Up

A estrutura de um programa em C

A estrutura genérica de um programa em C é a que se apresenta a seguir, podendo alguns dos elementos não existir:

Deverá existir sempre uma função main().

As funções têm a seguinte estrutura:

  tipo nome_da_funcao(parâmetros)
  {
    variáveis locais
    instruções em C
  } 
  

Assim, o programa:

  void main(void)
    {
      printf("Eu gosto do C\n");
    } 

O código contém apenas uma função, obrigatória, main() que não retorna nada (void) e que não tem parâmetros (outra vez void).

Como instrução da função temos apenas a chamada a printf(), uma função da biblioteca standard que escreve no ecrã. Neste caso escreve uma cadeia de caracteres (string). A combinação \n no fim da string indica uma mudança de linha (o caractere new line ou line feed).

Notar que no final de cada instrução existe sempre um terminador - ;

Se a chamada a printf() fosse: printf(".\n.1\n..2\n...3\n"); apareceria no ecrã o seguinte:

  .
  .1
  ..2
  ...3 
  
setas
setas Up

Variáveis

O C tem pré-definidos os seguintes tipos de dados simples:

tabela 1
[Tipo de dados] [Tamanho (bytes)] [Limite inferior] [Limite superior]
char 1 -128 127
unsigned char 1 0 255
short int 2 -32768 32767
unsigned short int 2 0 65535
int 4 -231 +231 - 1
long int 4 -231 +231 - 1
float 4 -3.2×10±38 +3.2×10±38
double 8 -1.7×10±308 +1.7×10±308

Geralmente nos sistemas UNIX os tipos int e long int são equivalentes (inteiros de 32 bits). No entanto noutros sistemas é possível que o tipo int seja equivalente a um short int (inteiro de 16 bits).

É necessário consultar a documentação do compilador para o sistema em questão.

O C não tem um tipo booleano pré-definido, no entanto, poderá usar-se um char (ou melhor um unsigned char) ou um int para o efeito.

O prefixo unsigned pode também ser usado com os tipos int e long int.

Para declarar variáveis em C, de um dado tipo, usa-se a seguinte regra:

tipo_das_variáveis lista_de_variáveis ;

Por exemplo:

  int i, j, k;
  float x, y, z;
  char ch;
  

Definição de variáveis globais

As variáveis globais, visíveis em todas as funções de um programa, declaram-se fora e antes de todas as funções (só são visíveis a partir do local da declaração).

Por exemplo:

  short number, sum;
  int bignumber, bigsum;
  char letter;
  
  void main(void)
  {
  
  }
  

É também possível inicializar as variáveis globais no momento da declaração. Usa-se para isso o operador de atribuição = (equivalente ao := do Pascal).

Por exemplo:

  float sum = 0.0;
  int bigsum = 0;
  char ch = 'A';
  
  void main(void)
  {
  
  }
  

Poderíamos ter feito a mesma coisa de outra forma (mas mais ineficiente):

float sum;
  int bigsum;
  char ch;
  
  void main(void)
  {
    sum = 0.0;
    bigsum = 0;
    ch = 'A';
  }

O C também permite múltiplas atribuições (colocar o mesmo valor em várias variáveis ao mesmo tempo):

a = b = c = d = 3;

O C tem uma palavra-chave que permite a definição de novos tipos - typedef. Esses novos tipos declaram-se utilizando a regra:

typedef tipo_já_definido novo_tipo;

Exemplo:

typedef float real;
  typedef char letter;
  
  real sum = 0.0;     /* o mesmo que float */
  letter ch = 'A';   /*  o mesmo que char */
  

Entrada e saída do valor de variáveis

As funções da biblioteca standard printf() e scanf() permitem escrever no ecrã e ler do teclado, respetivamente, o valor de variáveis.

Estas funções têm como primeiro parâmetro uma string especificando o formato e a ordem das variáveis a escrever ou a ler. Seguem-se como parâmetros as próprias variáveis pela ordem especificada.

Na string de formatação indica-se o local e o tipo de um valor de variável através do caractere % seguido de uma letra indicadora do tipo. Alguns dos tipos suportados são:

Exemplo:

printf("Os valores das três variáveis são: %c, %d, %f\n", ch, i, x);

Notas: As strings em C definem-se entre aspas ". . .", os caracteres simples aparecem entre plicas '.'; o texto normal da string de formatação aparece tal e qual no ecrã, os valores das variáveis aparecem nos locais indicados pelo caractere %; seguem-se as próprias variáveis que deverão aparecer pela mesma ordem e com os tipos indicados na string de formatação.

Um possível resultado da chamada anterior seria:

Os valores das três variáveis são: A, 41, 0.0

A função scanf() lê valores do teclado para variáveis. A sua estrutura é semelhante a printf().

Por exemplo:

scanf("%c%d%f", &ch, &i, &x);

Notas: Na lista de variáveis é necessário usar o operador & antes de cada variável; veremos mais tarde porquê.

setas
setas Up

Operações aritméticas

O C suporta as quatro operações aritméticas standard nas suas expressões que são representadas pelos símbolos habituais (+, -, *, /). Além destas operações aritméticas são suportadas outras.

A atribuição é representada no C pelo operador =. (No C a atribuição é considerada uma operação aritmética).

Exemplo:

i = 4;   ch = 'y';

Outros operadores aritméticos são os operadores de incremento e decremento, representados respetivamente por ++ e --.

Em geral geram código mais eficiente do que a soma ou subtracção de 1 unidade. Assim a atribuição x = x + 1; pode ser substituída simplesmente por x++;.

Os operadores ++ e -- podem ser pós fixos (colocam-se após a variável a incrementar ou decrementar) ou podem ser pré fixos (colocando-se antes da variável a incrementar ou decrementar.

Quando o operador é pós fixo a expressão x++ tem como valor o conteúdo de x antes deste ser incrementado, enquanto que com o operador pré fixo a expressão ++x representa já o valor de x depois de incrementado (em ambos os casos x é incrementado, o que muda é o valor que a combinação x++ ou ++x representa como conjunto).

Vejamos o exemplo:

  int x, y, w;
  void main(void)
  {
    x = ((++z) - (w--)) % 100;
  }
  

Este programa seria equivalente a:

  int x, y, w;
  
  void main(void)
  {
    z = z + 1;
    x = (z - w) % 100;
    w = w - 1;
  }
  

Um outro operador aritmético do C é o operador módulo - %.

Este operador é equivalente ao operador mod do Pascal e tem como resultado o resto da divisão inteira. Só pode ser utilizado com valores inteiros. (Ver os exemplos anteriores).

O operador de divisão /, pode ser usado com inteiros e reais. Se ambos os operandos forem inteiros o resultado é a divisão inteira. Assim a atribuição x = 3 / 2; coloca em x o valor 1, mesmo que x seja float ou double.

Se quisermos colocar em x o resultado correto da divisão real (se x for float ou double) deveremos escrever x = 3.0 / 2; ou x = 3 / 2.0; ou melhor x = 3.0 / 2.0; (sem conversões de um inteiro para real).

O C suporta também alguns modos expeditos de escrever atribuições. É comum termos de escrever nos programas expressões como i = i + 3; ou x = x * (y + 2); Expressões deste tipo podem ser abreviadas para qualquer coisa como variável op = expressão; e que é equivalente a variável = variável op (expressão);

Assim podemos reescrever as duas expressões anteriores como i += 3; x *= y + 2; Note-se que esta última expressão vale sempre x = x * (y + 2); e nunca x = x * y + 2;

setas
setas Up

Operadores de comparação

O operador de teste de igualdade no C é ==.

Note-se que é muito fácil trocar o teste de igualdade pelo operador de atribuição (só um =), o que conduz invariavelmente a erros difíceis de detetar.

A seguinte instrução condicional está sintaticamente correta: if (i = j) ...

No entanto o que faz é copiar o valor de j para i e tem como resultado o valor de j, que é interpretado como TRUE se for diferente de 0 e FALSE no caso contrário.

O que se pretende comparar é i com j - resultado TRUE se fossem iguais...

O operador de teste de desigualdade é em C !=. Os outros quatro operadores de comparação são iguais ao Pascal: <, <=, > e >=.

setas
setas Up

Operadores lógicos

Os operadores lógicos servem para combinar resultados de comparações e são geralmente utilizados nas instruções condicionais.

Os operadores lógicos do C são três:

Existem também os operadores & e |, com outro significado. Não confundir.

setas
setas Up

Precedências

Todos os operadores do C têm um nível de precedência. Os operadores de nível mais elevado são avaliados antes dos operadores de nível mais baixo.

Por exemplo, a expressão a + b * c é avaliada como a + (b * c)porque o operador *tem maior precedência do que o operador +. Os avaliado como (a - b) - c e não pela ordem inversa.

Na tabela seguinte podem ver-se todos os operadores do C pela ordem decrescente do nível de prioridade, e também a sua associatividade.

tabela 2
Operadores Associatividade
() [] -> . esquerda para a direita
! - ++ -- * & (cast) sizeof direita para a esquerda
* / % esquerda para a direita
+ - esquerda para a direita
<< >> esquerda para a direita
< <= > >= esquerda para a direita
== != esquerda para a direita
& esquerda para a direita
^ esquerda para a direita
| esquerda para a direita
&& esquerda para a direita
|| esquerda para a direita
?: direita para a esquerda
= += -= *= /= %= &= ^= |= <<= >>= direita para a esquerda
, esquerda para a direita

Assim a expressão a < 41 && 7 * b < c é avaliada como (a < 41) && ((7 * b) < c).

Da mesma forma a expressão a = b = fahr / celsius + limit é avaliada como a = (b = ((fahr / celsius) + limit)).

setas
setas Up

Exercícios

  1. Escreva um programa que leia n (um inteiro positivo) e de seguida n valores. Escreva como resultado a sua soma, média e a soma dos quadrados.
  2. Leia 10 valores e escreva o mínimo e o máximo.
  3. Leia um valor real, representando graus Celsius e escreva o seu equivalente em Fahrenheit na seguinte forma:
    
        100.0 graus Celsius equivalem a 212.0 graus Fahrenheit
    

  4. Leia um valor real representando o raio de um círculo e escreva a sua área, na forma:
    
        A área de um círculo de raio ... vale ...
    
    No caso do utilizador fornecer um valor negativo deverá escrever: Erro: O raio deve ser > 0.

  5. Dado um valor representando um número de segundos convertê-los para horas, minutos e segundos na forma:
    
        7322 segundos são 2 horas 2 minutos e 2 segundos
    

  6. Ler uma hora e uma duração (números inteiros), na forma horas-minutos (ou seja o valor 1230 representa 12 h 30 m) e produzir a soma no mesmo formato:
    
        Hora inicial:   1415
        Duração:        50
    
    Cuidado com casos como:
    
        Hora inicial:   2300
        Duração:        200
        Hora final:     100    
    
setas
setas Up