1 Objectivos
Introdução à programação em C.
Nesta secção vão-se rever alguns dos comandos fundamentais do sistema Unix. Ao iniciar a
leitura deste documento deve arrancar o seu PC no sistema Linux e fazer "login". Caso não
pretenda instalar o Linux no seu PC. Poderá, por exemplo:
©DEI-2009/2010 1
Princípios de Programação Procedimental – Ficha 1
2.1 ls (list)
Quando abre um terminal, a directoria actual é a directoria home. Esta directoria servirá para
armazenar todos os ficheiros que criar - por exemplo, todas as resoluções de fichas que realizar
nesta disciplina. Para saber o que existe na directoria em que se encontra actualmente deverá
executar o comando:
$ ls
O comando ls permite utilizar várias opções. Uma das mais importantes é a opção -a, que
mostra todos os ficheiros que existem na directoria, incluindo os ficheiros começados por um
ponto (.bash_profile) por exemplo. Por omissão estes ficheiros são considerados ocultos
e não são listados pelo ls. A ideia é não permitir a utilizadores inexperientes a manipulação
destes ficheiros que armazenam informação de configuração do sistema.
Outra das opções importantes do comando ls é a opção -l, que mostra os ficheiros num
formato `”longo". O formato longo inclui várias informações importantes sobre o ficheiro,
nomeadamente as suas permissões, a data em que foi criado, o seu tamanho, etc.
$ mkdir ppp
Cria uma directoria que poderá utilizar para armazenar dados relativos a esta disciplina.
Para permitir a navegação entre directorias, para, por exemplo, conseguir listar conteúdos ou
acrescentar um novo ficheiro numa directoria, utiliza-se o comando cd. Por exemplo, para
entrar na directoria "ppp" (depois de ter sido criada com o comando mkdir), escreve-se:
$ cd ppp
Importa aqui referir que há duas directorias com um significado especial: as directorias . e ...
A directoria . refere-se à directoria actual, enquanto que a directoria .. refere-se à directoria
anterior. Por exemplo, se a directoria actual for /home/jose/ppp, a directoria . será a
©DEI-2009/2010 2
Princípios de Programação Procedimental – Ficha 1
O comando rmdir serve para eliminar directorias vazias. Deve ser invocado a partir da
directoria anterior àquela que se pretende eliminar. Por exemplo, o utilizador jose pode, a
partir da sua directoria raiz /home/jose, utilizar o comando
$ rm ppp
O comando pwd mostra a directoria actual. Mais concretamente o resultado deste comando
resulta na impressão de todo o caminho até à directoria actual. Por exemplo,
$ pwd
poderá ter como resposta /home/jose/ppp, se esta for a directoria actual do utilizador
jose.
2.6 cp (copy)
O comando cp serve para copiar ficheiros. Na sua forma mais simples o comando cp recebe
dois argumentos, sendo o primeiro o nome do ficheiro de origem e o segundo o nome do
ficheiro de destino. Ao nome pode-se acrescentar, na forma de prefixo, a directoria onde se
encontra um ficheiro. Se não se fizer, o comando cp procura o ficheiro na directoria actual. Se,
por exemplo, o utilizador jose invocar o comando
$ cp /etc/xinetd.conf .
o resultado será que o ficheiro /etc/xinetd.conf será copiado para a directoria actual de
jose. Este facto é indicado pelo . passado ao cp. Note-se que o segundo argumento nunca
poderá ser omitido. Seria possível ao jose alterar o nome final do ficheiro, bastando nestes
©DEI-2009/2010 3
Princípios de Programação Procedimental – Ficha 1
2.7 mv (move)
O comando mv serve para mover ficheiros de uma directoria para outra. Poderá também ser
usado para alterar nome de um ficheiro sem o mudar de directoria. Nas versões mais simples, o
comando mv é semelhante ao comando cp, pelo que não se vai detalhar aqui a sua utilização. É
preciso apenas ter em mente que o ficheiro original deixa de existir, se o comando for bem
sucedido, passando apenas a existir o ficheiro final.
2.8 rm (remove)
O comando rm serve para eliminar um ou mais ficheiros. Por exemplo, a seguinte sequência de
comandos:
$ cp /etc/xinetd.conf .
$ rm xinetd.conf
apagará o ficheiro xinetd.conf copiado para a directoria actual pelo comando cp anterior.
Os comandos cat e less servem para mostrar o conteúdo de um ficheiro. Embora no Unix
não haja distinção entre ficheiros de texto e ficheiro binários, por norma, estes comandos são
utilizados exclusivamente em ficheiros de texto. Considere que tem um ficheiro com um
programa em C. Para poder ver o conteúdo desse ficheiro poderá utilizar o comando cat da
seguinte forma:
$ cat cliente.c
O resultado deste comando poderia ser algo como o que está representado na Figura 1.
©DEI-2009/2010 4
Princípios de Programação Procedimental – Ficha 1
$ less cliente.c
O output do comando less é exactamente o mesmo do comando cat, no entanto irá existir
uma pausa, controlada pelo utilizador, entre a exibição de cada página de texto.
©DEI-2009/2010 5
Princípios de Programação Procedimental – Ficha 1
2.10 Resumo
Comando Significado
ls Lista ficheiros e directorias.
mkdir directoria Cria a directoria directoria.
cd directoria Muda a directoria para directoria.
pwd Imprime o caminho para a directoria actual.
rmdir directoria Apaga a directoria vazia directoria.
cp ficheiro1 ficheiro2 Copia ficheiro1 para ficheiro2.
mv ficheiro1 ficheiro2 Move ou renomeia ficheiro1 para ficheiro2.
rm ficheiros Apaga ficheiros.
cat ficheiros Mostra conteúdo de ficheiros.
less ficheiros Mostra o conteúdo, uma página de cada vez.
3 Programação em C no Unix
Nesta disciplina vai poder utilizar dois tipos de ambientes para programar em C: um em linha
de comandos e outro em ambiente visual (IDE). Nos dois casos, a programação em C (bem
como em muitas outras linguagens compiladas), desde que o programador começa a escrever o
programa até que o executa, requer os seguintes passos:
1. Edição do programa;
2. Compilação e linkagem;
3. Execução do programa compilado;
4. Depuração.
Por norma, cada um destes passos é executado por um programa diferente, mas é possível que
estes programas estejam escondidos num ambiente integrado de desenvolvimento (IDE). Um
IDE permite ao programador efectuar cada um dos passos anteriores de forma relativamente
transparente e sem comutação, ou, pelo menos, com um número mínimo de comutações de
©DEI-2009/2010 6
Princípios de Programação Procedimental – Ficha 1
janelas no ambiente gráfico. No caso do Unix a execução manual destes passos é relativamente
simples e apresenta-se como muito instrutiva para um aluno que queira compreender todo o
processo de criação de um programa em C. Por esta razão apresenta-se de seguida um resumo
dos passos indicados anteriormente usando este sistema.
#include <stdio.h>
int main(void) {
printf("Ola Mundo!\n");
return 0;
}
Como poderá facilmente deduzir pelo código, este programa vai limitar-se a escrever a frase
"Ola Mundo!" no monitor e terminar logo de seguida. No entanto, para conseguir que o
programa produza este efeito, precisa de o compilar, linkar e executar. Para isso vai seguir os
seguintes passos:
• criar uma directoria com o nome aula1 que poderá utilizar para efectuar todas as
experiências de que necessitar nesta aula. De preferência, esta directoria aula1 deverá
ser criada dentro duma directoria que tenha criado para esta disciplina;
• descarregar o ficheiro ola_mundo.c para a directoria que acabou de criar;
• pode ver o conteúdo do ficheiro utilizando o comando cat ola_mundo.c.
Depois destes passos o programa está pronto para ser compilado. Para compilar o programa
poderá utilizar o programa gcc (gnu compiler collection), da seguinte forma:
$ gcc ola_mundo.c
Este comando deverá correr de forma totalmente silenciosa, isto é, sem qualquer mensagem de
resposta. Para verificar o sucesso do comando poderá fazer uma nova listagem dos conteúdos
da directoria com o comando ls. Deverá ter algo como o que está representado na Figura 2.
©DEI-2009/2010 7
Princípios de Programação Procedimental – Ficha 1
$ ./a.out
O ./ antes do nome do programa indica que o programa que está a executar se encontra na
directoria actual.
É também possível indicar ao gcc, que se pretende um nome diferente para o ficheiro
executável. Com efeito, a.out não é muito indicativo daquilo que faz o programa, além de
que poderá querer mais do que um executável na mesma directoria. Para chamar ola_mundo
ao executável poderá utilizar a opção -o do programa gcc. Por exemplo:
Poderá encontrar a lista completa de opções do gcc -- que é extremamente grande --,
fazendo man gcc. A partir deste momento para executar o programa deverá escrever
./ola_mundo. O resultado obtido deverá ser semelhante ao representado na Figura 3.
©DEI-2009/2010 8
Princípios de Programação Procedimental – Ficha 1
Alguns dos aspectos a ter em conta na escolha do editor de texto são precisamente a enfatização
da sintaxe e, sobretudo, a indentação automática. Não será demais realçar a importância da
indentação automática, na medida em que esta favorece muito a detecção rápida de alguns tipos
de erros, normalmente relacionados com colocação incorrecta de chavetas. A ausência desta
característica implica que todos os erros relacionados com faltas de chavetas ou chavetas a
mais, por exemplo, sejam detectados apenas no momento da compilação, sendo que as
mensagens debitadas pelo gcc poderão não apontar para o sítio onde se encontra efectivamente
o problema. Isto significa que um utilizador inexperiente pode perder bastante tempo a resolver
©DEI-2009/2010 9
Princípios de Programação Procedimental – Ficha 1
problemas que de outra forma nem existiriam. No pior dos casos, este tipo de erros poderá
chegar indetectado até ao momento da execução, podendo trazer consequências bastante
negativas.
4 Exercícios
2. Apague agora a directoria aula1. Na verdade não vai necessitar desta directoria,
porque quando expandir o ficheiro AulaPratica1.zip a directoria vai ser criada
automaticamente.
3. Mova o ficheiro AulaPratica1.zip para a directoria ppp. Expanda o ficheiro
utilizando o comando
$ unzip AulaPratica1.zip
No fim, certifique-se de que a árvore de directorias obtida está de acordo com a Figura
4.
4. Mude para a directoria aula1. Verifique o conteúdo da directoria.
5. Se ainda não compilou e executou o programa ola_mundo.c faça-o agora.
6. Edite o programa bom_em_C.c, para que o programa escreva o seu nome. Compile o
©DEI-2009/2010 10
Princípios de Programação Procedimental – Ficha 1
5 Code::Blocks
Para criar o seu primeiro programa, comece por iniciar o Code::Blocks. No menu da janela
principal do IDE seleccione “File/New/Project”'. O diálogo para a criação de um novo projecto
(Figura 5) deverá aparecer no ecrã.
©DEI-2009/2010 11
Princípios de Programação Procedimental – Ficha 1
Neste momento, tem um projecto com um ficheiro de código fonte pronto a ser compilado e
executado. Se expandir o item “Sources” na janela de navegação do projecto no lado esquerdo
do ecrã verá que foi criado um ficheiro com o nome “main.c”. Clique duas vezes sobre este
ficheiro e o código ficará visível no ecrã (ver Figura 6).
Para compilar e executar o programa em main.c basta pressione F9 (Build and Run). A
execução do programa resulta na abertura duma nova janela onde será possível ao utilizador
interagir através do teclado. É importante realçar que não poderá voltar a executar o programa
enquanto não terminar a execução anterior. A janela fecha-se premindo qualquer tecla após a
conclusão do programa. O output exibido na nova janela é visível na Figura 7.
©DEI-2009/2010 12
Princípios de Programação Procedimental – Ficha 1
Neste programa (gerado automaticamente) não existem erros de execução. No entanto, quanto
maior é a complexidade de um programa maior é a probabilidade de haver erros durante a sua
execução. Se encontrar erros na execução do seu programa poderá ser necessário utilizar o
"debugger". O Code::Blocks possui um interface de depuração muito completo que utiliza o
gdb. Comece por executar o seu programa em modo de "debug", para isso basta pressionar F8.
Pode verificar que o seu programa executou sem paragens e terminou sem que pudesse verificar
o output. Se quiser introduzir paragens na execução do programa durante o debug
(breakpoints), deve utilizar o botão esquerdo do rato para clicar na posição do código onde
pretende introduzir o breakpoint - deve fazê-lo na zona cinzenta imediatamente à direita do
número da linha (Figura 8). Nesse momento aparecerá nessa localização uma bola vermelha
(Nota: o procedimento para “desligar” um breakpoint é o mesmo). Pode reiniciar a execução
pressionando F8. Vai verificar que a execução pára imediatamente antes de executar a instrução
“marcada”. Para controlar a execução em debug pode utilizar o seguinte conjunto de teclas:
CTRL+F7 – Continuar até ao próximo breakpoint ou até ao fim do programa; F7 – Executar a
próxima linha; SHIFT+F7 – Executar a próxima linha dentro do método invocado;
SHIFT+CTRL+F7 – Executar a próxima linha dentro do método que invocou o método
corrente.
©DEI-2009/2010 13
Princípios de Programação Procedimental – Ficha 1
Se quiser saber o valor de algumas variáveis durante a execução deverá colocar "watches" para
essas variáveis e "breakpoints" nos locais onde pretende parar a execução do debug. Para o
fazer introduza os breakpoints que deseja, de seguida pressione F8 para iniciar a sessão de
debug. Quando a execução parar, clique com o botão direito sobre o nome da variável a
“vigiar”. Irá aparecer um menu onde deve seleccionar “Watch 'nome da variável'”. De seguida,
vá ao menu “Debug/Debugging Windows” e seleccione “Watches”. Irá aparecer uma nova
janela no ecrã onde será visível o valor da variável. Para ilustrar esta operação construiu-se o
exemplo da Figura 9.
©DEI-2009/2010 14
Princípios de Programação Procedimental – Ficha 1
É possível adicionar mais ficheiro de código (.c ou .h) ao seu projecto. No entanto, só pode
existir uma função main() dentro de cada projecto. Se tiver mais do que um main() em
vários ficheiros, o seu projecto não compilará. Deverá nessa altura comentar os main que não
interessam. Para comentar seleccione toda a função com o rato e pressione SHIFT+CTRL+C
(esta operação irá introduzir os caracteres “//” no início de cada linha seleccionada). Para
remover os caracteres de comentário, volte a seleccionar o código pretendido e pressione
SHIFT+CTRL+X.
Para adicionar novos ficheiros ao seu projecto, vá ao menu “File/New/File...”, seleccione o tipo
de ficheiro que quer criar (.h ou .c) e clique em “Go”. Depois comece por clicar em “Next”,
escolha a opção “C” na lista exibida, clique “Next”, introduza o caminho e o nome para o novo
ficheiro, clique “All” e “Finish” para terminar.
Imagine que se pretendia agora que escrevesse um programa para calcular a área de um
quadrado a partir do valor do lado que é pedido ao utilizador. Em Python e usando o Dr. Phyton
como IDE viria:
Depois de pedir ao utilizador o valor do lado, que guarda numa variável lado, faz o cálculo e
apresenta o resultado. Em C a situação é semelhante, como pode verificar na Figura 11:
©DEI-2009/2010 15
Princípios de Programação Procedimental – Ficha 1
• Todo o código deve estar escrito dentro de um módulo chamado main() que
devolve 0. Podem existir, no entanto, outros módulos num programa.
©DEI-2009/2010 16
Princípios de Programação Procedimental – Ficha 1
6 Exercícios
2. Altere o programa anterior para escrever também a sua idade e o seu peso no ecrã. Deve
utilizar variáveis para armazenar esta informação. Para guardar o peso deve utilizar uma
variável do tipo float. A chamada ao printf() deverá ter o seguinte aspecto:
printf("Chamo-me Jose, tenho %d anos e peso %.2f Kg", ...), onde as reticências devem
ser substituídas pelas variáveis adequadas.
4. Escreva um programa que leia dois números inteiros e que calcule e imprima no ecrã o
resultado da sua divisão. Mude o tipo de um dos números para float e mande executar
de novo o programa. O que pode verificar?
5. Escreva um programa que leia três números inteiros e calcule a sua média apresentando
o resultado no ecrã.
©DEI-2009/2010 17