Sie sind auf Seite 1von 13

Fundamentos de Programação em C: Uma Abordagem Algorítmica

“ Meus filhos terão computadores, mas


antes terão livros. Sem livros e sem
leitura, os nossos filhos não serão capazes
de escrever a sua própria história.”

- Bill Gates -
Elementos da
2 Linguagem
C

Sumário:
2.1-Gramáticas e Linguagens
2.2- Variáveis e Constantes
2.3- Tipo Elementar de Dados
2.4- Expressões
2.5- Comandos
2.6-Funções Bibliotecas
2.7-Exercícios Propostas

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 11


Fundamentos de Programação em C: Uma Abordagem Algorítmica

Este capítulo tem por finalidade, introduzir alguns conceitos de programação e


os elementos sintácticos da linguagem C. No seu término o leitor deverá ser
capaz de:

 Conhecer as várias unidades sintácticas da linguagem C.


 Descrever as regras para formação de identificadores.
 Classificar os várias tipos elementares de dados.
 Conhecer as leis de formação das expressões.
 Conhecer a tabela de precedências para o calculo das expressões.
 Conhecer a organização da biblioteca ANSI.

2.1- Gramáticas e Linguagens


Uma gramática é um conjunto finito de regras individuais, usadas para
descrever uma determinada linguagem natural. Entendemos por linguagem
natural, o português, o francês, o inglês, o russo,..,etc. O estudo de qualquer
linguagem natural, baseia-se na sua análise sintática, semântica, fonética,..,
etc.

A análise sintática, consiste em estudar a disposição das palavras numa frase


e das frases num texto. As funções mais importantes da análise sintática são
encontrar numa frase, o sujeito, o predicado e o verbo.

Na ciência de computação, existe uma área que estuda as linguagens de


programação. Os cientistas dessa área, utilizam modelos matemáticos para
descrever essas linguagens. Esses modelos possuem uma notação
apropriada, e recebem o nome de gramáticas formais ou gramáticas BNF
(Bakus-Naur-Form). Este nome, foi atribuído em homenagem aos matemáticos
John Backus e Peter Naur, pioneiros da ciência de computação, e
responsáveis pelo projeto da linguagem ALGOL 60.

Nas gramáticas formais, a análise sintática tem por finalidade, definir as regras
de formação dos identificadores, dos números, das cadeias de caracteres, dos
operadores, dos delimitadores, das palavras reservadas e dos comentários.

Identificadores, são conjuntos de caracteres, que gozam das seguintes


propriedades:

1º- Começam por uma letra;


2º- Os restantes caracteres são letras ou números;
3º- O caracter de separação (underscore) é permitido;
4º- Um identificador não ser uma palavra reservada.

Por exemplo, os identificadores:


num_de_palavras
hipotenusa
fordF150

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 12


Fundamentos de Programação em C: Uma Abordagem Algorítmica

arcoIris
contas_a_pagar
cateto
areaCircunferencia

estão bem formados, mas os identificadores:


prova de som Espaço em branco não é permitido
bob’s Apóstrofo não é permitido
arco-iris Hífen (traço) não é permitido
2pi Primeiro caracter deve ser uma letra
E(13) Parêntesis curvo não é permitido
carla@gmail Arroba não é permitido

não estão.

Fazem parte das boas prácticas de programação escrever o primeiro caracter


de um identificador com uma letra minúscula. Os identificadores são escritos
sem acentos.

Números, são sequências de dígitos que estão classificados em dois


conjuntos: os inteiros e os reais. Os números inteiros são escritos sem ponto
decimal. Esta representação é denominada por aritmética de ponto fixo. Os
números reais possuem um ponto decimal e uma parte fracionária. Para além
disso, eles podem ser representados por um expoente seguido de um inteiro
com ou sem sinal. Este expoente é representado pelo símbolo E, e
vulgarmente pronunciado como “10 elevada a”. Esta representação é
denominada por aritmética de ponto flutuante.

Por exemplo, os números:


5 -545 0 69
-78350 20100 -4521 12398712345

são inteiros, enquanto os números


10.0 5.0 E13 = 5 x 1013 1.23
2010.45 1.E2 = 1 x 102 - 124.45

são reais.

Cadeia de caracteres, são sequências finitas de dígitos, letras e símbolos


especiais delimitados por aspas. As aspas também podem representar um
caracter se estiverem entre aspas consecutivas.

Por exemplo, são cadeias de caracteres:


" Sem comentário"
" Maior objecto possível"
" Ele disse: "" não se preocupe"" e disparou a pistola""
" Receita do Bob's "

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 13


Fundamentos de Programação em C: Uma Abordagem Algorítmica

Operadores são caracteres especiais que indicam uma operação ou uma


relação. Fazem parte desse conjunto os seguintes símbolos:
+ Adição
- Subtracção
* Multiplicação
/ Divisão
% Resto da divisão inteira
>= Maior ou igual à
<= Menor ou igual à
!= Diferente de
< Menor do que
> Maior do que
== Igual à
&& e lógico
|| ou lógico
! não lógico
= Atribuição de valor
++ incremento
-- decremento

Delimitadores, são caracteres especiais que indicam o término de um


processo. Fazem parte desse conjunto os seguintes símbolos:
{} Abertura e encerramento de bloco
; Encerramento de uma instrução
[] Colchetes de índices
" " Abertura e encerramento de cadeia de caracteres
‘‘ Abertura e encerramento de um caracter
/* Início de comentário
*/ Término de comentário
() Abertura e encerramento de parâmetros e de expressões
"\0" Término de uma string

Comentários, são frases escritas pelo programador para descrever alguns


trechos do programa e são delimitadas pelos caracteres /* e */. Essas frases
são ignoradas pelo compilador, mas impressas no código do programa.

Palavras reservadas ou palavras-chave, são nomes escritos em letras


minúsculas, que servem para compor o programa. Essas palavras não podem
ser utilizadas como identificadores. Descrevemos em seguida, as palavras
reservadas da linguagem C padrão ANSI.
auto default int signed typedef while
break do long sizeof union if
case double register static unsigned for
const enum return struct void char
continue float short switch volatile main
extern goto else

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 14


Fundamentos de Programação em C: Uma Abordagem Algorítmica

2.2- Variáveis e Constantes


O conceito de variável na ciência de computação é análogo ao seu conceito na
matemática.

Para calcular os lados de um triângulo rectângulo, utilizamos a fórmula

H2 = A2 + B2

que é a representação simbólica do teorema de Pitágoras. Observa-se que ao


atribuir um valor a A e a B, obtêm-se necessariamente um valor para H. Mas,
se atribuirmos um novo valor a A e a B, perdemos os valores da atribuição
anterior.

Entendemos por variável, toda a entidade que recebe diferentes valores


durante a execução de um programa.

Para calcular a área de uma circunferência usamos a fórmula:

A = 3.1415 x R2

Os valores de A, variam em função dos valores de R, mas 3.1415 permanece


inalterável em todo o cálculo.

Entendemos por constante, toda a entidade que recebe um único valor


durante a execução de um programa.

Nas linguagens de programação, as variáveis e as constantes, fazem parte de


um conjunto denominado por identificadores.

Todo o identificador deve ser declarado. A sua declaração consiste em definir


o tipo de dados que esse identificador irá receber.

Declaramos uma constante com a instrução:

const tipo identificador = valor;

e declaramos uma variável com a instrução:

tipo identificador1, identificador2, ...., identificadorn;

onde:
tipo = int, float, double e char.

Por exemplo, as seguintes declarações


const float PI = 3.1415;
const char BRANCO = ‘ ‘;
const int FALSE = 0;

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 15


Fundamentos de Programação em C: Uma Abordagem Algorítmica

const int TRUE = 1;

são constantes, enquanto as declarações


int i, j, k;
float salario, areaQuadrado, desconto, totalDaFatura;
char vogal, resposta, sexo;

são variáveis.

Durante o processo de compilação, cada variável ou constante é associada à


uma ou mais posições de memória.

Fazem parte das boas prácticas de programação, escrever as constantes com


letras maiúsculas. Dessa forma o programador poderá distingui-las com muita
facilidade das variáveis que o programa utiliza.

2.3- Tipo Elementar de Dados


Existem vários tipos elementares de dados que são fundamentais para
descrever qualquer linguagem de programação. Na linguagem C temos os
seguintes tipos elementares: int, float, double, char.

2.3.1- Inteiro
O tipo elementar de dados inteiro é um subconjunto dos números inteiros
positivos e negativos, denotado pela palavra reservada int. Associado a este
tipo de dados temos os seguintes operadores aritméticos:

+ Adição
- Subtração
* Multiplicação
/ Divisão
% Resto da divisão

O resultado de operações com dados do tipo inteiro é um dado do tipo inteiro.

Por exemplo:

Operação Matemática Computação


8+5 13 13
8*5 40 40
8/5 1.6 1
8%5 3 3

Observe que a divisão de dois números inteiros na computação pode


apresentar um resultado diferente do correspondente valor na matemática.

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 16


Fundamentos de Programação em C: Uma Abordagem Algorítmica

2.3.2- Real

O tipo elementar de dados real é um subconjunto dos números reais, denotado


pelas palavras reservadas float ou double. O tipo float é utilizado para
precisão simples, enquanto o tipo double é para precisão dupla, e aplica-se à
problemas de investigação científica nas áreas de matemática, astronomia e
física. Associado a este tipo de dados temos os seguintes operadores
aritméticos:

+ Adição
- Subtracção
* Multiplicação
/ Divisão

O resultado de operações com dados do tipo real é obrigatoriamente um


dado do tipo real.

Por exemplo:

Operação Matemática Computação


8.0 + 5.0 13.0 13.0
8.0 * 5.0 40.0 40.0
8.0 / 5.0 1.6 1.6

2.3.3- Lógico
A linguagem C não possui os valores lógicos: verdadeiro e falso. As variáveis
lógicas, vulgarmente denominadas por booleanas, são armazenadas
internamente como inteiros e possuem a seguinte interpretação: Zero se o
valor lógico for falso e UM se o valor lógico for verdadeiro. Associado a este
tipo de dados, temos os seguintes operadores lógicos:

&& Conjunção
|| Disjunção
! Negação

que podem ser expressos pela tabela de verdade:

p q p || q p && q !q
1 1 1 1 0
1 0 1 0 1
0 1 1 0 0
0 0 0 0 1

Em função desta tabela, podemos tirar as seguintes conclusões:

p&&q é verdadeiro, quando as duas proposições forem verdadeiras;


p||q é verdadeiro, quando pelo menos uma proposição for verdadeira;
!p é verdadeiro, quando p for falso.

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 17


Fundamentos de Programação em C: Uma Abordagem Algorítmica

Uma regra muito importante para simplificar expressões lógicas são as leis de
Morgan, cuja definição é expressa por:

! (p && q) ! p || !q
! (p || q)  ! p && ! q

As relações de comparação, também produzem um resultado do tipo lógico,


isto é, verdadeiro (UM) se a comparação for verdadeira e falso (ZERO) se a
comparação for falsa.

2.3.4- Caracter
O tipo elementar de dados caracter, denominado pela palavra reservada char,
representa um e apenas um caracter alfanumérico. Fazem parte dos caracteres
alfanuméricos, as 26 letras latinas (A,..,Z ; a,..,z), os 10 algarismos árabes
(0..9) e uma quantidade de caracteres especiais, como sinais de pontuação,
espaço em branco,…,etc. Esse conjunto foi definido pela Organização
Internacional de Padrões (ISO) e pelo seu correspondente americano, ASCII
(American Standard Code for Information Interchange - código americano
padrão para intercâmbio de informações).

Para cada caracter corresponde um código ASCII. Por exemplo: O caracter em


branco possui o código ASCII 32, enquanto o caracter cujo código é 127 varia
de computador para computador. (consulte Internet).

Os caracteres estão ordenados segundo o código ASCII. Assim o caracter zero


é menor do que o caracter um pois o código ASCII do caracter zero é o número
48, enquanto o código ASCII do caracter um é o número 49. Em termos gerais,
na tabela ASCII, a seguinte relação é válida

‘1’ < ‘2’ < … <’9’ < … < ‘A’ <’B’ < … <’Z’ < …< ‘a’ <’b’ < … <’z’.

2.4- Expressões
Entendemos por expressões, uma combinação de variáveis, constantes,
operadores, funções e parêntesis. (O conceito função será estudado mais
tarde). Uma variável ou uma constante também pode ser considerado como
uma expressão. Por exemplo, são expressões:

(consumoActual - consumoAnterior ) * tarifa


salarioBase + abonoFamila - impostoTrabalho + isencaoHorário
( notaParcial + notaLaboratorio + notaExame )/3
( numero > 5 ) || ( numero < 20 )

Contudo, a formação das expressões baseia-se nas seguintes regras:

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 18


Fundamentos de Programação em C: Uma Abordagem Algorítmica

1º- Não podem existir dois símbolos de operação consecutivos;


2º- Os parêntesis podem ser utilizados para especificar a ordem de execução
das operações;
3º- Para cada parêntesis esquerdo deve existir o correspondente parêntesis
direito;
4º- O sinal de multiplicação não pode ser omitido.

Em função destas regras, podemos concluir que as expressões


3.1415 * raio * raio
(nota1 + nota2 + nota3) / 3
(nota1 > 10 ) || ( nota 2 < 15)
hipotenusa * hipotenusa = lado1* lado1 + lado2*lado2

estão bem formadas, ao passo que as expressões


a+-b+c dois símbolos de operação consecutivos
ab + c omissão de sinal de multiplicação
(a + 7) && c – d) omissão de parêntesis

não estão.

Expressões aritméticas são aquelas que realizam operações aritméticas e


retornam um valor no domínio inteiro ou real. Por exemplo se as variáveis a, b,
c, d, e, f forem do tipo inteiro, as expressões que descrevemos em seguida,
retornam valores inteiros.
a + b - c+ d
(e+f+h)/3
3.1415 * r * r

Expressões relacionais são aquelas que realizam uma comparação entre


duas expressões. Estas retornam ZERO se o resultado for falso e UM se o
resultado for verdadeiro. Por exemplo, sejam a e b variáveis do tipo inteiro e
suponhamos que a= 5 e b= 6.
Expressão Resultado
a == b 0 (falso)
a != b 1 (Verdadeiro)
a >= b 0 (falso)
a <= b 1 (verdadeiro)
a>b 0 (falso)
a<b 1 (verdadeiro)

Expressões lógicas são aquelas que realizam operações lógicas. Estas


retornam UM se o resultado for verdadeiro e ZERO no caso contrário. Por
exemplo, sejam a e b variáveis do tipo inteiro e suponhamos que a= 5 e b = 6.
Expressão Resultado
(a == 0 ) || (b == 0 ) 0 || 0 = 0

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 19


Fundamentos de Programação em C: Uma Abordagem Algorítmica

!a !5 = 0
(a!= 0) && (b != 0) 1 && 1 = 1

O cálculo ou avaliação de uma expressão, depende da ordem de


processamento dos seus operadores, pois vejamos. Dada a expressão
aritmética:

3 + 6 * 13

Vamos efectuar o cálculo da esquerda para a direita.

3 + 6 * 13
= 9 * 13
= 117

Agora, faremos o cálculo no sentido inverso.

3 + 6 * 13
= 3 + 78
= 81

Qual o resultado correcto? 117 ou 81?

O cálculo de expressões baseia-se na seguinte regra: As expressões são


calculadas da esquerda para a direita, mas calcula-se em primeiro lugar as
operações, cujos operandos têm maior precedência.

Apresentamos em seguida, uma tabela resumida que define a ordem de


precedência dos operadores.

Operadores Nível de precedência


++, --, !, - Maior precedência
* , / ,%
+, -
>, >=, <, <=
==, !=
&&
||
=, +=,-=, /=, *=, %= Menor precedência

Com a base nessa regra, expressão anterior é calculada da seguinte forma:

3 + 6 * 13
= 3 + 78
= 81

Para consolidar os conhecimentos, faremos o cálculo das seguintes


expressões:

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 20


Fundamentos de Programação em C: Uma Abordagem Algorítmica

2*3+4*5
= (2 * 3) + (4 * 5)
= 6 + 20
= 26

15 / 4 * 4
= (15 / 4) * 4
= 3*4
= 12

- 10 + 20/5
= -10 + (20/5)
= -10 + 4
=-6

2+3*4-5
= 2+(3*4)–5
= 2 + 12 – 5
= (2 + 12 ) – 5
= 9

2 + 8 % 7 >= 3 * 6 - 15
= 2 + 1 >= 18 - 15
= 3 >= 3
=1

((5 * 3) > (1 + 4) ) || (4 < (1 – 5)) && (5 > 3)


= (15 > 5) || ( 4 < -4) && ( 5 > 3)
= 1 || 0 && 1
= 1 || 0
= 1

!1 && ( 3* 3) / 3 < 15 - 35 % 7
= !1 && 9 / 3 < 15 - 0
= !1 && 3 < 15
= !1 && 1
= 0 && 1
= 0

Não confie cegamente na ordem de precedência dos operadores. Como


recomendação, utilize parêntesis para agrupar as expressões, mesmo
quando se conhece à precedência dos operadores.

Vimos que as expressões são avaliadas da esquerda para a direita. Mas, na


linguagem C, a avaliação de uma expressão lógica termina, quando uma das
componentes possui um valor lógico que determina o valor da expressão. Por
exemplo:

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 21


Fundamentos de Programação em C: Uma Abordagem Algorítmica

(c < 20) && (d > c)

Suponhamos sem perda da generalidade, que c = 23 e que d = 45. Calculamos


em primeiro lugar o valor da componente c < 20. Como o resultado dessa
comparação é falso (ZERO) e como essa expressão é uma conjunção de
condições, então o calculo da componente d > c não é realizado. Esse facto
deve-se ao seguinte princípio: Na conjunção o valor lógico Falso é um
elemento absorvente.

2.5- Comandos
A especificação de uma acção é chamada de comando ou instrução. A
execução de um comando tem por finalidade alterar o estado das variáveis
existentes num determinado programa. Os comandos da linguagem C serão
objectos de estudo nos próximos capítulos.

2.6- Funções Bibliotecas


Os operadores convencionais não permitem que se escreva expressões
trigonométricas, logarítmicas, exponenciais, etc. Essas expressões são
descritas por operadores especiais, denominados por funções bibliotecas que
têm prioridade sobre os demais.

Na linguagem C, as funções bibliotecas, denominadas por biblioteca-padrão,


não são comandos da linguagem, mas programas desenvolvidos por terceiros,
que servem de suporte ao desenvolvimento do software. Esses programas
estão declarados e definidos em arquivos cabeçalho-padrão, que são incluídos
no nosso programa com a directiva de pré-processamento

#include cabeçalho

A biblioteca-padrão definida pela ANSI, possui os seguintes arquivos


cabeçalho-padrão:

<assert.h> contém a macro assert para implementar diagnósticos;

<ctype.h> contém as funções para testar e converter caracteres;

<errno.h> contém uma variável global que é actualizada com os erros


produzidos pela execução de certas funções;

<float.h> contém a definição dos tipos de dados reais;

<limits.h> contém a definição dos tipos de dados inteiros;

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 22


Fundamentos de Programação em C: Uma Abordagem Algorítmica

<locale.h> contém funções que permitem definir parâmetros locais,


como por exemplo, informação relativa às convenções das datas, do
tempo, da ortografia, de maneira a tornar a linguagem universal;

<math.h> contém um conjunto de funções matemáticas;

<setjmp.h> contém funções que permitem contornar o mecanismo


normal de chamada e retorno de funções;

<signal.h> contém funções para observar os sinais que podem ser


emitidos durante a execução de programas, permitindo o controlo de
interrupções;

<stdarg.h> contém ferramentas para implementar funções que aceitam


um número variável de argumentos;

<stdef.h> contém definições de tipos e de constantes usadas pela


linguagem em certos cálculos, como por exemplo, o size_t ou o NULL;

<stdio.h> contém as funções para entrada e de saída de dados e para o


processamento de ficheiros;

<stdlib.h> contém funções para conversão de informação textual em


informação numérica e vice-versa, para alocação dinâmica de memória,
geração de números aleactórios, pesquisa, ordenação, operações
aritméticas inteiras e outras funções utilitárias.

<time.h> contém funções para acesso ao relógio e ao calendário,


permitindo o processamento de informação horária.

Faculdade de Engenharia de Universidade Católica de Angola - Manuel Menezes 23

Das könnte Ihnen auch gefallen