Академический Документы
Профессиональный Документы
Культура Документы
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.
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;
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;
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
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
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
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; }
while (car != EOF && nlidos < 5) { if (isdigit(car)) { digitos[nlidos] = car; Programao em C/C++ Pg. 6/8
2009 Joo Galamba
IMSI-04 2009
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