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

1 Introduo ao C++

Vamos introduzir a linguagem C++ por meio de alguns exemplos. Nos captulos seguintes todos os aspectos aqui introduzidos sero abordados em mais detalhe e veremos que alguns destes exemplos podero ser escritos de uma outra forma, mais sucinta e sofisticada.

1.1 Exemplo 1: Converso de Fahrenheit para Celsius


Tpicos Principais: Variveis, Tipos e Expresses Aritmticas Descrio: Pretendemos desenvolver um programa para imprimir a seguinte tabela de converso de graus Fahrenheit para Celsius:
Fahrenheit Celsius

0,0 20,0 40,0 60,0 80,0 100,0 120,0 140,0 160,0 180,0 200,0 220,0 240,0 260,0 280,0 300,0

-17,8 -6,7 4,4 15,6 26,7 37,8 48,9 60,0 71,1 82,2 93,3 104,4 115,6 126,7 137,8 148,9

O programa dever comear em 0F e, para incrementos de 20F, ter que calcular o equivalente em C. A converso efectuada atravs da seguinte frmula:

5 C= F 32 9

Programao em C/C++

Pg. 1/8
2009 Joo Galamba

IMSI-04 2009

Cdigo:
#include <stdio.h> /* * Imprime a tabela de converso de Fahrenheit->Celsius. */ int main () { float fahr, celsius; int incremento; fahr = 0; incremento = 20; // limite inferior da tabela

while (fahr <= 300) { celsius = (5.0/9.0) * (fahr - 32.0); printf("%f\t->%f\n", fahr, celsius); fahr = fahr + incremento; } return 0;

Explicao: Este programa introduz vrios conceitos, incluindo, comentrios, declaraes, variveis, expresses aritmticas etc. (ver frente). As linhas iniciais ...
/* * Imprime a tabela de converso de Fahrenheit-Celsius. */

so um comentrio de bloco. Em C, tudo o que estiver entre /* e */ ignorado pelo compilador e pode ser usado para inserir comentrios que facilitem a compreenso do programa. Utilizamos este tipo de comentrios para introduzirmos explicaes mais elaboradas sobre o bloco de cdigo que se segue. Na linha...
fahr = 0; // limite inferior da tabela

a frase que se encontra depois de // um comentrio, neste caso de linha, ou seja, o compilador ignora tudo o que est aps // at ao final da linha. Utilizamos este tipo de comentrio para explicaes muito breves. Em C, todas as variveis devem ser declaradas antes de serem usadas, normalmente no incio da funo e antes de qualquer utilizao. Uma declarao consiste de um nome de tipo e uma lista variveis. Um tipo de dados informa ao compilador quanto espao ser necessrio em memria para armazenar um valor desse tipo, para alm do que, limita as operaes que podemos efectuar sobre valores desse tipo. Assim, nas linhas
float fahr, celsius; int incremento;

declaramos trs variveis: fahr, celsius e incremento.


Programao em C/C++ Pg. 2/8
2009 Joo Galamba

IMSI-04 2009

fahr e celsius so do tipo float e, como tal, podem armazenar nmeros reais (eg, 1.0, 2.1, -3.1415). Estes nmeros tambm so conhecidos por nmeros de vrgula flutuante e da o nome float. incremento do tipo int e pode armazenar nmeros inteiros, isto , sem parte fraccionaria. O C providencia mais alguns tipos que veremos mais frente como, por exemplo, char, short, long etc. O programa comea com as expresses de atribuio de valores iniciais s variveis fahr e incremento.
fahr = 0; incremento = 20; // limite inferior da tabela

O operador = serve para atribuir os valores dos termos da direita aos termos da esquerda. Notese que o ponto-e-vrgula separa, quer declaraes, quer expresses. Como cada linha da tabela calculada sempre da mesma forma, utilizamos um ciclo while, cujo corpo, ou bloco (um bloco um conjunto de expresses entre { e } ), para efectuar esse clculo:
while (fahr <= 300) { celsius = (5.0/9.0) * (fahr - 32.0); printf("%f\t->%f\n", fahr, celsius); fahr = fahr + incremento; }

O ciclo termina quando fahr > 300. Como fahr incrementado em 20 em cada iterao do ciclo, este termina quando fahr for igual a 320. Dentro do ciclo a expresso...
celsius = (5.0/9.0) * (fahr - 32.0);

calcula a frmula em cima e coloca o resultado em celsius. O resultado exibido pelo printf. A directiva %f indica que a varivel na posio correspondente um float e as directivas \t e \n indicam, respectivamente, que deve ser impresso um tab e um caractere de fim de linha. O printf suporta outras directivas que veremos mais frente. De seguida, a expresso
fahr = fahr + incremento;

actualiza o valor fahr. Com esta expresso, mais o teste em


while (fahr <= 300)

controlamos o ciclo. Ou seja, o esqueleto do ciclo :


while (fahr <= 300) { fahr = fahr + incremento; }

Note-se que, apesar de fahr ser um float e incremento ser um int, podemos adicion-los e o compilador no produz qualquer mensagem de erro ou de aviso. Isto possvel porque um nmero inteiro tambm um nmero real (o inverso que no verdadeiro). Veremos mais
Programao em C/C++ Pg. 3/8
2009 Joo Galamba

IMSI-04 2009

frente a converso entre tipos.

1.2 Exemplo 2: Converso de Fahrenheit para Celsius, 2 Verso


Tpicos Principais: Constantes, Formatao c/ printf Descrio: Primeiro, comeamos por notar que temos valores constantes soltos pelo cdigo. Eles so o valor do incremento (20) e dos limites inferior e superior da tabela (0 e 300). Se os quisermos alterar, temos que varrer todo o cdigo procura desses valores. Vamos acrescentar as seguintes definies:
const int INCREMENTO = 20, // incremento de valores fahrenheit LIMITE_INFERIOR = 0, // limite inferior da tabela de fahrenheit LIMITE_SUPERIOR = 300; // limite superior da tabela de // fahrenheit

Podemos tambm simplificar a atribuio da varivel fahr combinando declarao e atribuio num s passo:
float fahr = LIMITE_INFERIOR;

Em terceiro lugar, notamos que o printf, e qualquer funo em C, pode receber uma expresso e no apenas uma varivel. Ou seja, podemos imprimir directamente o valor da expresso de celsius "dentro" do print. Finalmente, ainda em relao ao printf, podemos melhorar a qualidade da impresso e indentao com
printf("%6.1f\t->%6.1f\n", fahr, (5.0/9.0) * (fahr 32.0));

Agora em vez de %f temos %6.1f. O que que isto faz? Faz com que os valores de fahrenheit sejam impressos com seis dgitos de largura e uma casa decimal. Cdigo:
#include <stdio.h> const int INCREMENTO = 20, LIMITE_INFERIOR = 0, LIMITE_SUPERIOR = 300; // // // // incremento de valores fahrenheit limite inferior da tabela de fahrenheit limite superior da tabela de fahrenheit

/* * Imprime a tabela de converso de Fahrenheit -> Celsius. */ int main () { float fahr = LIMITE_INFERIOR; while (fahr <= LIMITE_SUPERIOR) { printf("%6.1f\t->%6.1f\n", fahr, (5.0/9.0) * (fahr - 32.0)); fahr = fahr + INCREMENTO; } return 0; }

Programao em C/C++

Pg. 4/8
2009 Joo Galamba

IMSI-04 2009

1.3 Exemplo 3: Contagem de Vogais


Tpicos Principais: Entrada e Sada de Caracteres, Decises, EOF Descrio: O prximo programa l caracteres introduzidos pelo utilizador at que este introduza o caractere especial de fim de ficheiro, o EOF (End of File). No final exibe quantas vogais foram introduzidas. Cdigo:
#include <stdio.h> /* * Conta vogais. */ int main () { char car int nvogais = getchar(); = 0;

while (car != EOF) { if (car == 'a' || car == 'e' || car == 'i' || car == 'o' || car == 'u') { nvogais = nvogais + 1; } car = getchar(); } printf("Introduziu %d vogais.\n", nvogais); return 0;

Explicao: NOTA: para no complicar a exposio, este programa contm um erro subtil que ser discutido quando dermos Caracteres e Entradas e Sadas (E/S) em pormenor. Este programa introduz a funo de getchar que no recebe argumentos e l e devolve um caractere da entrada padro - o teclado. A varivel car recebe esse caractere e declarada como sendo do tipo char.
char car = getchar();

Como queremos contar quantas vogais o programa encontra, declaramos a varivel n que servir de contador:
int nvogais = 0;

Note-se que inicializamos o valor a 0 (zero), dado que, ainda no foram lidas quaisquer vogais. De seguida o programa entra em ciclo at que o utilizador insira o caractere especial de fim de ficheiro (CTRL+D em Unix; CTRL+Z e ENTER na consola do Windows). Quando isso acontece getchar devolve EOF que , precisamente, o valor desse caractere. Ou seja, queremos estar em ciclo enquanto que o caractere introduzido for diferente do tal EOF. Para testarmos se dois
Programao em C/C++ Pg. 5/8
2009 Joo Galamba

IMSI-04 2009

valores so diferentes utilizamos o operador!= . O esqueleto do ciclo fica ento:


while (car != EOF) { ... car = getchar(); }

Durante o ciclo queremos analisar o caractere lido e, caso seja uma vogal, incrementamos o contador. Isto , se o carcter lido for uma vogal decidimos incrementar n. Para tal possumos a instruo if cuja definio resumida a seguinte:
if (condio verdadeira) { ... }

Um caractere uma vogal se for igual a 'a' ou igual a 'e' ou igual a 'i' ou igual a 'o' ou igual a 'u'. Em C testamos podemos testar se dois valores so iguais usando o operador == . Por outro lado o operador || operador lgico ou. Ou seja, em
if (car == 'a' || car == 'e' || car == 'i' || car == 'o' || car == 'u') { nvogais = nvogais + 1; }

o equivalente, em C, para o seguinte teste:


"se o caractere introduzido for o 'a' OU o 'e' OU o 'i' ento o contador incrementado" OU o 'o' ou o 'u'

1.4 Exemplo 4: Leitura e Contagem de Dgitos


Tpicos Principais: Vectores, Inteiros e Caracteres Descrio: O prximo programa l caracteres introduzidos pelo utilizador at que este introduza o caractere especial de fim de ficheiro, o EOF (End of File), ou at que introduza 5 dgitos (um dgito um valor entre 0 e 9) . No final exibe os dgitos introduzidos. Cdigo:
#include <stdio.h> /* * Conta dgitos e exibe-os. */ int main () { char digitos[5], // armazena digitos lidos car = getchar(); int nlidos = 0, nexibidos = 0; // contador de dgitos lidos // contador de dgitos exibidos

while (car != EOF && nlidos < 5) { if (isdigit(car)) { digitos[nlidos] = car; Programao em C/C++ Pg. 6/8
2009 Joo Galamba

IMSI-04 2009

nlidos = nlidos + 1; } car = getchar();

printf("Introduziu %d dgitos.\n", nlidos); printf("Os dgitos introduzidos foram:\n"); while(nexibidos < nlidos) { printf("%c\n", digitos[nexibidos]); nexibidos = nexibidos + 1; } return 0;

Explicao: Este programa um pouco mais complexo e introduz alguns elementos novos. Logo na declarao de variveis, temos
char digitos[5], // armazena digitos lidos

digitos um vector de caracteres. Um vector uma sequncia de elementos, de um mesmo tipo, consecutivos e por ordem. Quando definimos um vector devemos fixar o seu tamanho entre [ e ] (mais frente veremos que podemos fixar o tamanho de outras formas ou, inclusive, declarar um vector sem tamanho). Neste caso, digitos possui espao para 5 caracteres e ir armazenar os cinco dgitos que vamos ler. Conforme mencionmos, os elementos do vector so armazenados consecutivamente e por ordem. Ou seja, podemos aceder a um qualquer dgito indicando o seu nmero de ordem ou ndex. Por exemplo, se quisermos imprimir segundo elemento do vector:
putchar(digitos[1]);

Em C/C++ (e em quase todas as linguagens de programao) os ndices de um vector comeam em 0 e vo at D - 1, em que D a dimenso do vector. Assim, para imprimir o ltimo elemento de digitos fazemos:
putchar(digitos[4]);

A funo putchar a inversa do getchar, ou seja, mostra o caractere passado como argumento. Alternativamente, poderamos usar o printf da seguinte forma:
printf("%c", digitos[4]);

A directiva %c do printf serve para exibir um caractere. De acordo com a descrio, lemos caracteres enquanto que utilizador no insira EOF e o nmero de dgitos lidos seja inferior a 5. O cabealho do while indica isso mesmo:
while (car != EOF && nlidos < 5) { ... car = getchar(); }

O operador && efectua o AND lgico. A condio A && B verdadeira se ambos A e B forem verdadeiros. Assim, a ttulo de exemplo, 1 <= 2 && 'X' != 'Y' uma condio verdadeira, ao passo que, 1 > 2 && 'X' != 'Y' falsa. A varivel nlidos armazena o nmero de dgitos lidos. Para sabermos se o caractere lido um dgito, utilizamos a funo da biblioteca padro do C isdigit, que retorna verdadeiro se o
Programao em C/C++ Pg. 7/8
2009 Joo Galamba

IMSI-04 2009

caractere passado como argumento um dgito. Esta funo, juntamente com outras para anlise de caracteres, est declarada no cabealho ctype.h e dai a linha
#include <ctype.h>

logo no incio do programa. Se o caractere for realmente um dgito devemos guarda-lo em dgitos para o imprimirmos no final do programa. Devemos tambm registar que lemos um dgito incrementando o contador de dgitos nlidos .
if (isdigit(car)) { digitos[nlidos] = car; nlidos = nlidos + 1; }

Note-se que o contador nlidos funciona como ndex para o vector de caracteres. Quando o programa l o primeiro dgito, nlidos possui o valor da inicializao, ou seja, 0. Ora, 0 precisamente o valor da posio em digitos onde queremos armazenar o primeiro dgito. Aps guardarmos o dgito, incrementamos em uma unidade o valor do contador nlidos que passa a ter o valor 1, valor da posio do segundo dgito (quando e se ele for lido). Uma vez lidos todos os caracteres, informamos quantos dgitos foram introduzidos,
printf("Introduziu %d dgitos.\n", nlidos);

e exibimos cada um dos dgitos introduzidos, isto , varremos o vector digitos imprimindo cada um dos elementos:
while(nexibidos < nlidos) { printf("%c\n", digitos[nexibidos]); nexibidos = nexibidos + 1; }

A varivel nexibidos actua como contador auxiliar de elementos. Convm recordar que, aps o ciclo while anterior, nlidos armazena quantos caracteres foram lidos.

Programao em C/C++

Pg. 8/8
2009 Joo Galamba

IMSI-04 2009

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