Escolar Documentos
Profissional Documentos
Cultura Documentos
24 de Fevereiro de 2003
Contedo
2 Estrutura de um programa em C. 8
2.1 Directivas de pr-compilao. . . . . . . . . . . . . . . . . . . . . . 8
2.2 Declarao de variveis globais. . . . . . . . . . . . . . . . . . . . . 8
2.3 As funes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 A funo main(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 Exerccios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4 Funes. 15
4.1 As partes de uma funo. . . . . . . . . . . . . . . . . . . . . . . . . 15
4.1.1 Cabealho ou Prottipo. . . . . . . . . . . . . . . . . . . . . 15
4.1.2 Corpo de uma funo. . . . . . . . . . . . . . . . . . . . . . 15
4.2 Funes sem parmetros. . . . . . . . . . . . . . . . . . . . . . . . . 15
4.3 Funes com parmetros. . . . . . . . . . . . . . . . . . . . . . . . . 16
4.3.1 Passagem de parmetros por valor. . . . . . . . . . . . . . . . 16
4.3.2 Passagem de parmetros por referncia. . . . . . . . . . . . . 17
5 Vectores. 18
5.1 Operaes com vectores. . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.1 Declarar um vector. . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.2 Aceder aos elementos do vector. . . . . . . . . . . . . . . . . 18
1
6 Apontadores. 20
6.1 Aceder aos endereos de memria onde se encontram as variveis. . . 20
6.2 Variveis apontadores. . . . . . . . . . . . . . . . . . . . . . . . . . 20
6.3 Exerccios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
8 Estruturas de dados. 26
8.1 Declarao de uma estrutura em C. . . . . . . . . . . . . . . . . . . . 26
8.2 Variveis do tipo estrutura. . . . . . . . . . . . . . . . . . . . . . . . 27
8.2.1 Declarao de variveis. . . . . . . . . . . . . . . . . . . . . 27
8.2.2 Utilizao das variveis. . . . . . . . . . . . . . . . . . . . . 27
8.3 Vectores de estruturas. . . . . . . . . . . . . . . . . . . . . . . . . . 27
8.3.1 Declarao de vectores. . . . . . . . . . . . . . . . . . . . . 27
8.3.2 Operao de vectores. . . . . . . . . . . . . . . . . . . . . . 28
8.4 Apontadores para estruturas. . . . . . . . . . . . . . . . . . . . . . . 28
8.4.1 Apontadores - declarao e utilizao. . . . . . . . . . . . . . 28
8.4.2 Atribuio dinmica de memria para uma estrutura. . . . . . 28
8.4.3 Operao dos contedos apontados. . . . . . . . . . . . . . . 28
8.5 Definir novos tipos. . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
8.6 Exerccios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
9 Ficheiros. 30
9.1 Ficheiros de texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
9.1.1 Abrir um ficheiro de texto. . . . . . . . . . . . . . . . . . . . 30
9.1.2 Escrever para um ficheiro de texto. . . . . . . . . . . . . . . . 30
9.1.3 Ler de um ficheiro de texto. . . . . . . . . . . . . . . . . . . 31
9.1.4 Fechar um ficheiro de texto. . . . . . . . . . . . . . . . . . . 31
9.2 Ficheiros binrios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
9.2.1 Abrir um ficheiro de binrio. . . . . . . . . . . . . . . . . . . 32
9.2.2 Escrever para um ficheiro binrio. . . . . . . . . . . . . . . . 32
9.2.3 Ler de um ficheiro binrio. . . . . . . . . . . . . . . . . . . . 33
9.2.4 Fechar um ficheiro binrio. . . . . . . . . . . . . . . . . . . . 33
9.3 Orientao e navegao num ficheiro. . . . . . . . . . . . . . . . . . 33
9.3.1 O ficheiro foi aberto correctamente? . . . . . . . . . . . . . . 33
9.3.2 Como que eu sei que cheguei ao fim do ficheiro, quando estou
a ler? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
9.3.3 Estive a consultar o ficheiro, mas agora queria realizar uma
nova consulta... a partir do incio do ficheiro!... . . . . . . . . 34
9.4 Exerccios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2
Este pequeno apontamento serve para apresentar rapidamente as funcionalidades
bsicas da linguagem C. No entanto, muito fica por cobrir, devendo o interessado pro-
curar outras fontes para aprender esta linguagem poderosa. O meu livro preferido
The C Programming Language de Brian Kernighan e Dennis Ritchie (edio da
Prentice Hall). O manual do UNIX (comando man) um companheiro inseparvel
durante a escrita de um programa, pelo que outra fonte que vivamente recomendo.
3
Captulo 1
Durante a segunda metade do sculo XX, o papel dos sistemas informticos na soci-
edade teve um crescimento impressionante. Os computadores tm sido fundamentais
no desenvolvimento cientfico e tecnolgico (e.g. explorao espacial, projecto do Ge-
noma Humano), mas tem tambm influenciado a sociedade em geral (e.g. telecomuni-
caes, operaes bancrias, Internet).
Um computador uma mquina electrnica com memria, capaz de realizar vrios
clculos aritmticos e lgicos por segundo. Porm, para cada aplicao que se pretenda
que o computador realize, necessrio instru-lo sobre as tarefas que dever realizar
com os dados. A esta tarefa chama-se Programao.
Um programa uma sequncia de instrues que o computador deve realizar de
forma a processar os dados e obter os resultados correctamente.
4
mquinas diferentes entendem linguagens-mquina diferentes;
muito tempo despendido para escrever um programa;
depuramento e correco de programas simplesmente infernal.
Desta forma, fcil imaginar que a quantidade de programadores em todo o mundo era
extremamente reduzida, o que implicava um reduzido nmero de aplicao de compu-
tadores.
5
o desenvolvimento de aplicaes poderia ser feito em equipas;
as aplicaes poderiam ser mais complexas.
Dado que o nvel de programao se situa muito acima da linguagem-mquina, a apli-
cao de simples tradutores como um assembler j no seria possvel. Surgiram en-
to os compiladores, aplicaes capazes de procurar erros de sintaxe e concepo nos
textos dos programas e transformar as instrues em linguagem quase-natural para lin-
guagem mquina. Uma nica instruo como
PRINT "Ol, tudo bem?"
em BASIC (ordenando o computador para imprimir uma frase no ecr), seria traduzida
em algumas dezenas de instrues em cdigo mquina.
6
Tabela 1.1: Arquitecturas e Sistemas Operativos.
Arquitecturas Sistemas operativos
Intel x86 Windows
UNIX (Linux, Free BSD, Solaris, etc)
BeOS
PowerPC (Mac) MacOS ver 7, 8, 9
MacOS X (UNIX)
HP HP-UX (UNIX)
SGI (Silicon Graphics) IRIX (UNIX)
SUN Solaris (UNIX)
1.3 Compiladores.
Tal como referido anteriormente, os compiladores transformam os textos dos progra-
mas (em linguagem de alto-nvel) em cdigo-mquina. Como o cdigo-mquina
produzido para utilizar os recursos oferecidos pelo sistema operativo, facilmente se
depreende que para cada sistema operativo dever existir um compilador.
Assumindo que se escreveu um programa em linguagem C. Se esse programa for
compilado para Windows, o cdigo-mquina gerado no ser inteligvel para o sistema
operativo Linux, nem para o MacOS. Para o programa ser executvel em vrios siste-
mas operativos, pois ento necessrio compil-lo para cada um dos sistemas. Num
futuro captulo, ser explicado o processo de compilao de um programa.
7
Captulo 2
Estrutura de um programa em
C.
#define PI 3.14159265
As duas primeiras linhas indicam ao compilador que o programa utiliza funes que
se encontram definidas nos ficheiros stdio.h (standard input/output) e math.h. Funes
tipicamente utilizadas so:
8
int contador = 0;
2.3 As funes.
No ltimo bloco escreve-se o cdigo das funes (aquilo que realmente faz mexer o
programa). As funes so declaradas atravs do tipo do valor retornado, o identifica-
dor da funo e a lista dos argumentos que a funo recebe.
No seguinte exemplo, teremos uma funo que calcula o comprimento da hipote-
nusa de um tringulo rectngulo, recebendo como argumentos os comprimentos dos
catetos:
float calculahipotenusa (float cat1, float cat2)
A funo chamada calculahipotenusa() devolve um resultado do tipo float ( esquerda
do nome da funo), aceitando como argumentos dois valores do tipo float, que sero
identificados dentro da funo pelos nomes cat1 e cat2.
A sequncia de instrues que a funo deve realizar encapsulada entre chavetas.
Em C, as chavetas so utilizadas para agrupar sequncias de instrues. Dentro do
grupo de instrues, existe um primeiro bloco em que so declaradas as variveis locais
funo e, finalmente, a sequncia de instrues. Continuando o exemplo, o cdigo da
funo poderia ser o seguinte:
{
float hip; /* Declarao da varivel local hip */
9
main()
{
float c1, c2, hipotn; /* Declara as variveis locais */
2.5 Exerccios.
1. Dados os valores de duas resistncias, pretende-se obter os valores das resistn-
cias equivalentes quando associadas em srie e em paralelo. Projecte o algoritmo
de um programa capaz de realizar esta tarefa.
10
Captulo 3
11
if (saldo < compra)
{
printf("O saldo insuficiente para realizar a compra.\n");
printf("Por favor, efectue um carregamento do seu carto.\n");
}
No seguinte caso, avaliada a relao maior-igual-menor entre dois nmeros:
if (a > b)
printf("%d maior que %d.\n", a, b);
else
if (a < b)
printf("%d menor que %d.\n", a, b);
else
printf("So iguais.\n");
3.2 Ciclos.
As ciclos decorrem da necessidade de repetir a mesma sequncia de aces at que
determinada condio seja alcanada.
12
3.2.1 Ciclos for().
Os ciclos for() so utilizados quando as operaes de inicializao e incremento so
simples, normalmente utilizando uma varivel como contador do ciclo.
O mtodo de declarao de um ciclo for() o seguinte:
soma = 0;
for(contador = 1; contador < 5; contador++)
{
printf("Contador: %d\n", contador);
soma += contador;
}
printf("Somatrio: %d\n", soma);
produziria a sada:
Contador: 1
Contador: 2
Contador: 3
Contador: 4
Somatrio: 10
13
do {
printf("Insira um nmero entre 0 e 20: ");
scanf("%d", &numero);
} while ( (numero < 0) && (numero > 20) );
3.3 Exerccios.
1. Dados dois valores, pretende-se saber se o primeiro maior, igual ou menor do
que o segundo. Construa uma hiptese possvel de resoluo deste problema.
2. Escreva um algoritmo que permita calcular o factorial de um nmero inteiro
(n!). Tenha em ateno de que no existem factoriais de nmeros negativos! Por
definio, 0! igual a 1 (um).
3. Num jogo, introduzido um nmero inteiro que dever ser adivinhado pelo jo-
gador, atravs de palpites. Para cada palpite, dever ser indicado ao jogador se
o nmero a adivinhar maior ou menor do que o palpite. Quando o jogador
finalmente adivinha o valor, dever ser indicado o nmero de palpites realizados.
14
Captulo 4
Funes.
15
printf("1 - Inserir\n");
printf("2 - Remover\n");
printf("3 - Sair\n\n");
}
por valor;
por referncia.
(...)
(...)
main ()
{
float cat1 = 3.00;
float cat2 = 4.00;
float hip;
16
variaveis cateto1 e cateto2 (dentro da funo hipotenusa) no afectam os valores das
variveis cat1 e cat2.
auxiliar = *variavel1;
*variavel1 = *variavel2;
*variavel2 = auxiliar;
}
(...)
main ()
{
float a = 3.00;
float b = 4.00;
troca(&a, &b);
(...)
}
Repare que na chamada da funo troca() na funo main(), so passados os endereos
das variveis a e b, na forma &a e &b. No cabealho da funo troca(), as variaveis
variavel1 e variavel2 so apontadores (identificados pelo asterisco que os prefixa na
declarao) para valores do tipo float. Um apontador uma varivel que guarda um
endereo de memria. Nas linhas de instruo, o asterisco (*) indica que queremos
aceder ao contedo do endereo apontado:
17
Captulo 5
Vectores.
(...)
}
No exemplo anterior, definido um vector chamado resistencia, com capacidade para
dez valores do tipo float.
18
O primeiro elemento do vector encontra-se no ndice zero. Desta forma, o ltimo
elemento encontra-se no ndice dimenso-1, em que dimenso dimenso do vector.
O seguinte exemplo demonstra alguns exemplos de utilizao dos vectores.
main()
{
float resist[10];
(...)
19
Captulo 6
Apontadores.
20
int *apontador;
O operador * indica que a variavel apontador um apontador para uma posio de
memria onde se pretende armazenar - neste caso - um valor inteiro. Supondo o se-
guinte excerto de cdigo-fonte:
int valor = 7;
int *apontador;
No seguinte caso, pretende-se que uma funo altere / actualize os valores das
variveis que so passadas como argumentos. Suponha que num programa se pretende
trocar os valores de duas variveis, chamando a funo troca.
troca(variavel1, variavel2);
Esta chamada da funo forneceria apenas os valores das variveis, sendo impossvel
funo actualizar os contedos das variaveis, dado que a funo desconhece os ende-
reos onde os valores se encontram. A funo tem que conhecer os endereos onde as
variveis armazenam os seus valores. Isso conseguido utilizando a seguinte chamada:
troca(&variavel1, &variavel2);
Desta forma, a funo recebe no os valores das variveis, mas sim os seus endereos.
O cdigo-fonte da funo poderia ser o seguinte:
troca(int *v1, int *v2)
{
int aux;
21
/* aux passa a ter o valor apontado por v1 */
aux = *v1;
6.3 Exerccios.
1. Escreva um programa que defina uma varivel para conter valores inteiros, e
um apontador para inteiros. Ao apontador dever ser atribudo o endereo da
varivel. Para a varivel imprima as sua posio em memria e o seu valor. Para
o apontador, imprima a sua posio em memria, o seu valor e o valor na posio
de memria apontada.
2. Escreva uma funo que retorne um apontador para a 1a ocorrncia de um carc-
ter numa string ou o valor zero se o carcter no existir na string. A funo deve
ter como argumentos a string e o carcter a procurar.
22
Captulo 7
Apontadores e memria
dinmica.
23
float *v;
int n;
(...)
(...)
free(a);
A chamada da funo realloc() recebe como argumentos um apontador para o bloco
de memria previamente reservado com uma funo malloc() de forma a saber qual a
poro de memria a ser redimensionada, e o novo tamanho absoluto para o bloco de
memria.
24
7.3 Exerccios.
1. Leia uma sequncia de 10 nmeros do teclado usando apontadores em lugar de
ndices. Usando a mesma tcnica (apontadores) determine o maior e o menor
valor. Reserve memria dinmica em vez de declarar o vector de uma forma
esttica.
2. Ler uma sequncia de nmeros do teclado (sequncia terminada em zero).Escreva
no ecr os nmeros que esto acima da mdia. Utilize um vector dinmico para
armazenar os nmeros.
25
Captulo 8
Estruturas de dados.
struct ponto {
float x;
float y;
};
As estruturas declaradas podem ser utilizadas como tipos de campos de outras estru-
turas. Se pretendermos criar uma estrutura que defina um rectngulo a partir de dois
vrtices opostos, poderemos escrever:
struct rectangulo {
struct ponto p1;
struct ponto p2;
};
26
8.2 Variveis do tipo estrutura.
8.2.1 Declarao de variveis.
Aps a definio da estrutura, esta pode ser utilizada para declarar vriaveis. A decla-
rao das variveis no muito diferente do usual. Supondo que queremos declarar
variveis - r1 e r2 - para conter as posies de duas partculas, podemos escrever o
seguinte:
x = 1.5;
y = 3.6;
27
8.3.2 Operao de vectores.
Os campos dos diversos elementos de um vector so acedidos utilizando o operador .
(ponto).
vp[0].x = 2.3;
vp[0].y = 5.2;
vp[1].x = vp[0].x * 4;
vp[2] = vp[0];
28
8.5 Definir novos tipos.
Em C, possvel definir novos nomes de tipos, utilizando o typedef.
typedef struct ponto pontocart;
(...)
8.6 Exerccios.
1. Um projctil pode ser caracterizado pela sua posio e velocidade. Estas duas
grandezas so vectoriais, sendo compostas pelas componentes x e y. A partir da
sua posio inicial r0 = (r0x, r0y) e da sua velocidade inicial v0 = (v0x, v0y)
possvel determinar a sua posio-velocidade para qualquer instante a partir das
seguintes equaes:
x = x0 + v0x * t;
y = y0 + v0y * t - 5 * t^2
vx = v0x;
vy = v0y - 10 * t;
Pretende-se desenvolver um programa que a partir das condies iniciais de lan-
amento de um projctil se determine a posio e velocidade para qualquer ins-
tante (o instante inserido pelo utilizador). Na fase final de desenvolvimento,
o programa dever aceitar a velocidade de lanamento na forma de mdulo e
inclinao em relao horizontal.
Sugesto: crie uma estrutura para conter a informao de um vector (cartesiano).
Crie depois uma outra estrutura onde os dados do projctil (vectores posio e
velocidade) recorram anterior estrutura.
2. Declare uma estrutura capaz de armazenar o nome, o nmero, o ano de entrada,
o curso e quantidade de cadeiras feitas. Defina um vector de 100 estruturas.
(a) Escreva uma funo para ler os valores para uma determinada estrutura do
vector.
(b) Para um determinado curso (a perguntar ao utilizador), o programa deve
responder quantos alunos fizeram 10 ou menos cadeiras em mais de cinco
anos.
(c) Visualize no monitor todos os cursos inseridos sem repeties.
(d) O programa deve dizer qual o curso com melhor aproveitamento (curso
com maior mdia de cadeiras feitas por aluno).
29
Captulo 9
Ficheiros.
(...)
30
Tabela 9.1: Modos de acesso a ficheiros
Modo de acesso String Comentrio
Leitura "r" A leitura pode ser em qualquer ponto do ficheiro.
A abertura do ficheiro falha se o ficheiro no existir.
Escrita "w" A escrita pode ser em qualquer ponto do ficheiro.
Durante a abertura, se o ficheiro j existir,
apagado para criar um novo.
Escrita "a" A escrita apenas pode ser no final do ficheiro.
Durante a abertura, caso o ficheiro no exista,
criado um novo.
Leitura / Escrita "r+" A leitura pode ser em qualquer ponto do ficheiro.
A escrita pode ser em qualquer ponto do ficheiro.
Leitura / Escrita "w+" A leitura pode ser em qualquer ponto do ficheiro.
A escrita pode ser em qualquer ponto do ficheiro.
Leitura / Escrita "a+" A leitura pode ser em qualquer ponto do ficheiro.
A escrita apenas pode ser no final do ficheiro.
numero = 2;
fprintf(fh, "Linha %d\n", numero);
(...)
31
9.2 Ficheiros binrios.
Os ficheiros binrios armazenam os dados tal e qual como eles se encontram na mem-
ria. Um int representado num ficheiro binrio tal como guardado na memria (em
formato mquina). Desta forma, espreitar para um ficheiro binrio pode dar resultados
ininteligveis para ns, humanos.
(...)
typedef struct {
char cidade[50];
short temperatura;
} registo;
(...)
registo ficha;
FILE *fh;
fh = fopen("temperaturas.dat", "ab");
32
(...)
A linha de cdigo que contm a funo fwrite() copia para o ficheiro a poro de
memria identificada pela varivel ficha.
typedef struct {
char cidade[50];
short temp;
} registo;
(...)
registo ficha;
FILE *fh;
fh = fopen("temperaturas.dat", "rb");
fread(&ficha, sizeof(registo), 1, fh);
printf("Cidade %s - Temp: %hd o C.\n", ficha.cidade, ficha.temp);
(...)
A linha de cdigo que contm a funo fread() copia do ficheiro para a varivel ficha
um registo composto por um nome de cidade e respectiva temperatura.
33
tentar abrir para leitura um ficheiro inexistente;
criar um ficheiro num disco sem espao disponvel ou sem permisses de escrita
(e.g. CD-ROM)...
Desta forma, convm certificar de que no houve quaisquer problemas antes de se pro-
ceder a qualquer leitura ou escrita no ficheiro. A funo fopen() retorna um apontador
nulo - NULL - quando falha. A seguinte rotina testa a abertura do ficheiro, e no caso
de falha, aborta a execuo do programa.
if ( fh = fopen("ficheiro", "w+") == NULL) {
perror("fopen");
exit(0);
}
(...)
34
Uma funo mais verstil a fseek() que capaz de colocar o cursor em qualquer ponto
do ficheiro. A funo fseek() aceita como parmetros:
(...)
9.4 Exerccios.
1. Escreva um programa que realize as seguintes operaes:
Deve escrever trs frases (inseridas pelo utilizador) num ficheiro de texto.
Dever ler as frases escritas no ficheiro referido na alnea anterior, e apresent-
las no ecr.
2. Pretende-se armazenar as temperaturas de vrias cidades de um determinado dia
num ficheiro binrio. O nome do ficheiro dever seguir o seguinte formato DDM-
MAAAA.dat, em que:
DD o dia;
MM o ms;
AAAA o ano. 2. Cada registo dever conter o nome da cidade e a respec-
tiva temperatura medida.
(a) Escreva um programa que dever guardar os registos das temperaturas re-
lativas a uma data inserida pelo utilizador, num ficheiro binrio.
(b) Escreva um segundo programa que dever apresentar as temperaturas me-
didas num determinado dia, e calcular a mdia das temperaturas.
35