Вы находитесь на странице: 1из 71

Breve introdução à

linguagem C
Bibliografia de apoio
• Linguagem C, Luís Damas
C
• Criada pelos autores do UNIX, o Sistema Operativo em que o Linux é
baseado.
• Linguagem muito poderosa, que dá muita liberdade aos
programadores e que facilita a intercalação de código de baixo nível
(em Assembly)
• Ótima para aplicações de comunicação, como pretendemos
Como “dar o salto” do pseudocódigo para uma
linguagem de programação de alto nível
• Ao princípio é simples. Se sabe pseudocódigo, sabe o essencial.
• Claro que há linguagens que são mais simples do que outras. Por exemplo, para
um português, é mais fácil aprender italiano do que húngaro. Mas se não nos
prendermos demasiado nos pormenores e nos focarmos apenas no mais
importante, a coisa fica fácil.
Um primeiro programa
Um primeiro programa
#include <stdio.h>
void main()
{
printf(“Olá mundo\n”);
}
#include <stdio.h>
• A linguagem C não possui funções de entrada e saída, como acontece
com quase todas as outras.
• Então, é comum incluírem-se, no início dos programas, diretivas
dirigidas ao compilador, sobretudo as include para que ele inclua
funções de livrarias que estão disponíveis.
• Por exemplo, para leitura e escrita, é comum o uso da livraria stdio.h
(standard i/o) sem a qual não poderíamos usar a função printf que vai
imprimir o texto no ecrã.
void main
• Nas linguagens de alto nível, por uma questão de estruturação dos
programas, é comum o uso de funções (vá lá, sub-rotinas) que nos
permitem dividir os programas em bocadinhos e usarmos esses
‘bocadinhos’ quando quisermos.
• A linguagem C – e não só – obriga a definir uma sub-rotina principal que,
por isso mesmo, é denominada main.
• As funções, em princípio, são sub-rotinas que retornam um valor (um
número ou uma cadeia de caracteres, por exemplo). E então temos de dar
um tipo ao resultado da função como damos às variáveis.
• Mas podemos não ter interesse em que uma determinada função retorne
seja o que for e, para esses casos, a C tem o tipo void. O tipo void não
corresponde a um número, nem a uma cadeia de caracteres, nada. É isso
mesmo: void!
void main
• O código dentro de uma função está entre chavetas. Aliás, de uma
forma geral, os blocos de código são colocados entre chavetas.
printf(“Olá mundo\n”);
• printf() é uma das inúmeras funções usadas em C para imprimir algo
(no ecrã, por exemplo)
• As cadeias de caracteres são colocadas entre aspas
• \n significa ‘new line’, ou seja, no fim da cadeia de caracteres imprime
um carácter new line para mudar para a linha seguinte
• As linhas de código são terminadas por ponto e vírgula
O carácter \
• Este carácter retira significado ao que vem a seguir a ele. Por
exemplo, \n faz com que o compilador entenda que não é a letra ‘n’ a
ser impressa, mas sim uma mudança de linha.
• Por exemplo, \” permite escrever aspas dentro de um texto. Por
exemplo,
printf(“Que lindo “dia de aulas” tive hoje”)
provocaria um erro que é evitado se escrevermos
printf(“Que lindo \“dia de aulas\” tive hoje”).
Exercícios
• Consultar a página 14 do livro de Luís Damas
• Resolver os Exercícios resolvidos ☺
• Resolver os exercícios 15 a 18
Tipos de variáveis
Inteiros
int

Exemplo: int numero;


Imprimir valores inteiros
Ler valores inteiros
Quantos bytes tem um inteiro?
• Bem, isso depende do computador, mas…
Variantes de inteiros

Podemos escrever apenas short ou long ou…


Esse prefixo deve surgir também na leitura e
na escrita
Resumo dos tamanhos
Assumindo uma máquina com inteiros de 2 bytes:
Números reais: float e double
Escrever números reais
Um único carácter: o tipo char
Para ler um caráter, devemos usar getchar()
Já agora, o putchar()
Strings: cadeias de caracteres
• As strings são arrays de caracteres terminados com um caráter null:
‘\0’.
• As operações com strings obrigam ao uso de funções específicas
incluídas em string.h
Exercícios
• Resolver os Exercícios resolvidos do Cap. 2
• Resolver os exercícios 9 e 10
Testes e condições
Verdadeiros e falsos
• Em C, o valor FALSO é representado por 0. Qualquer valor diferentes
de 0 corresponde a VERDADEIRO.
Operadores relacionais
if…else
Falsos e verdadeiros, 0 e não 0
Lembram-se do que dissemos sobre falsos e verdadeiros? Então esta é outra
versão do programa anterior:
Atenção às chavetas e aos ;
if’s e else’s encadeados
Operadores lógicos
Ordem de precedência dos operadores
switch
Como funciona o switch
break
Exercícios
• Exercícios 16 a 20
Ciclos
while
for
for
do…while
Ciclos: resumo
Operadores ++ e --
Mas…
Operadores ++ e --
Atribuições compostas
Exercícios
• Resolva os Exercícios resolvidos.
Estruturas (structures)
Estruturas (structures)
• Vimos tipos de dados simples como inteiros e reais.
• Há, por vezes, necessidade de criarmos tipos mais complexos, com mais informação.
Suponhamos, por exemplo, que queríamos um tipo que permitisse guardar dados úteis
sobre livros duma biblioteca; por exemplo, título, autor, género e código.
• Podemos definir “o tipo Livro” como uma estrutura (structure):
struct Livro
{
char titulo[100];
char autor[50];
char género[100];
int codigo;
}
Estruturas (structures)
• Para declararmos uma variável do tipo Livro chamada info_livro:

struct Livro info_livro;


Aceder aos campos duma estrutura
• Para preencher ou ler uma estrutura, temos que aceder aos seus
campos através de variável.campo.
• Por exemplo, info_livro.codigo = 101;

• Atenção aos campos do tipo string, porque em C, as operações com


strings obrigam ao uso de funções específicas incluídas na livraria
string.h. Assim, por exemplo, para colocar o título num livro teríamos
de escrever
#include <string.h>
strcpy(info_livro.titulo,”Tão felizes que nós éramos”);
Apontadores
O que é um apontador?
• É uma variável que contém o endereço de memória de outra.
• Dito assim, a coisa parece simples, mas não é assim tanto!
• Bom, vamos ver como isto funciona: vamos ver o que são
apontadores, como se declaram, como se usam e porque são úteis.
Como podemos ver a RAM e as nossas
variáveis lá guardadas
• Podemos ver a RAM do nosso computador como um vetor de bytes consecutivos:

• Quando criamos uma variável, o compilador vai escolher um espaço na RAM


onde colocá-la. Por exemplo, ao declaramos uma variável chamada ch do tipo
char com char ch; o que acontece é que esta variável vai ocupar um byte na
memória, por exemplo o 5000:
E depois?
• O resto já sabemos: quando escrevemos, por exemplo,
ch = ‘A’;
estamos a dizer ao compilador para colocar o caráter ‘A’ na posição
5000 da RAM.

• O compilador associa a cada variável uma posição ÚNICA em


memória, capaz de armazenar um conteúdo do tipo da variável. E
quando nos referimos a uma variável pelo nome, estamos a referir-
nos ao seu conteúdo, o que está guardado no endereço da variável.
Um apontador
• Existem depois as variáveis do tipo apontador que contêm os
endereços de outras variáveis.
• Por exemplo, se eu definir um apontador chamado ptr ele será uma
variável, também com um espaço na memória.

• E se eu atribuir a esse apontador o endereço de ch,assim


ptr = &ch;
eu estarei a dizer ao compilador que quero que a variável chamada ptr
tenha como conteúdo o endereço da variável ch (é esse o significado
do operador &).
Um apontador… aponta!
• E direi que ptr aponta para ch:
Declarar um apontador
• A sintaxe da declaração de um apontador é
tipo *ptr
em que
ptr é o nome da variável do tipo apontador
tipo é o tipo da variável apontada
* indica que é um apontador

• Exemplos:
char a, b, *p, c, *q;
int idade, *pidade;
Atribuir conteúdo a um apontador
• Como em variáveis de qualquer tipo, a atribuição de um valor inicial
na altura da declaração de um apontador é uma boa prática em
programação.
• Exemplo:
int a=5;
float pi=3.14;
int ptr = &a;
float ptr_para_pi = &pi;
E depois?
• E *ptr dá-me o valor da variável apontada por ptr. Por exemplo,
depois desta instrução
int ptr = &a;
escrever
printf(“%d”,x)
ou
printf(“%d”,*ptr)
é a mesma coisa!

Вам также может понравиться