Sunteți pe pagina 1din 21

PAULO G. G.

SOARES
COMPILADOR C
Para comear a programar em C preciso um compilador, ferramenta que transforma o cdigo fonte num
programa executvel.

Ambientes WINDOWS:

Para escrever o cdigo-fonte, necessitamos de um IDE, ou seja de um ambiente de desenvolvimento
integrado. Entre inmeros IDEs que existem disponveis na WEB para download destaca-se:


---> DevC++

---> Eclipse

---> Visual C/C++ da Microsoft


Depois de escrever o cdigo s compilar, se no existirem erros, gera-se o executvel, que o resultado do
cdigo...

I IN N C CI IO O P Pr ro og gr ra am ma a o o C C
Bases de Programao em C
O que a programao?

A programao a arte da criao (ou alterao) de um programa de computador, um conjunto concreto de
instrues para um computador desempenhar. Computador, neste contexto, significa qualquer coisa que
tenha capacidade de processamento. O programa escrito numa linguagem de programao, embora seja
possvel, com alguma dificuldade, escrev-lo directamente em linguagem de mquina.

Diferentes linguagens de programao funcionam de diferentes modos. Por esse motivo, os programadores
podem criar programas muito diferentes para diferentes linguagens; muito embora, teoricamente, a maioria
das linguagens possa ser usada para criar qualquer programa.

O que um algoritmo?

Um algoritmo , num certo sentido, um programa abstracto. No entanto, os programas so, excepo dos
menores, visualizados mais facilmente como uma coleco de algoritmos menores combinados de um modo
nico - da mesma forma que uma casa construda a partir de componentes.

Dessa forma, um algoritmo uma descrio de como um computador pode ser levado a executar uma
PAULO G. G. SOARES
operao simples e especfica. Um programa, por outro lado, uma entidade que na verdade implementa
uma ou mais operaes de forma que seja til para as pessoas.

Histria:

O C uma linguagem de programao estruturada e padronizada criada na dcada de 1970 por Dennis
Ritchie e Ken Thompson para ser usada no sistema operativo UNIX. Desde ento espalhou-se por muitos
outros sistemas operativos, e tornou-se uma das linguagens de programao mais usadas. O C tem como
ponto-forte a sua eficincia e a linguagem de programao de preferncia para o desenvolvimento de
sistemas operativos, apesar de ser tambm usada para desenvolver aplicaes.

Em que consiste?

O C uma linguagem de programao relativamente minimalista que opera prxima do hardware, e mais
semelhante linguagem assembly do que as restantes linguagens. O cdigo de C pode ser compilado para
ser executado em quase todos os computadores/sistemas operativos. A Linguagem C foi criada com um
objectivo em mente: facilitar a criao de programas extensos com menos erros recorrendo ao paradigma da
programao algortmica ou procedimental, mas sem nunca sobrecarregar o processador.

Vantagens:

* Uma linguagem nuclear extremamente simples, com funcionalidades no-essenciais, tais como funes
matemticas ou manuseamento de ficheiros, fornecida por um conjunto de bibliotecas de rotinas
padronizada;

* A focalizao no paradigma de programao procedimental;

* Um sistema de tipos simples;

* Um acesso de baixo-nvel memria do computador, atravs do uso de ponteiros;

* Parmetros que so sempre passados por valor para as funes e nunca por referncia ( possvel simular a
passagem por referncia com o uso de ponteiros);

* Definio do alcance lexical de variveis;

* Estruturas de variveis, (structs), que permitem que dados relacionados sejam combinados e manipulados
como um todo.


Desvantagens:
PAULO G. G. SOARES

Algumas caractersticas teis que faltam linguagem C mas que so encontradas em outras linguagens
incluem:

* Segurana

* Colecta automtica de lixo

* Classes ou objectos com comportamento (ver programao orientada por objectos)

* Apoio nativo de multithreading e networking


O C permite que o programador permanea sempre em controlo do que o programa est a fazer. Isto o
que por vrias vezes permite o cdigo de C correr de uma forma mais eficiente que muitas outras linguagens.
Uma consequncia da aceitao geral da linguagem C que frequentemente os compiladores, bibliotecas e
at intrpretes de outras linguagens de nvel maior sejam eles prprios implementados em C.

Onde programar? Como j foi dito anteriormente, usa-se um compilador.
Instalao do Dev-C++:

1 - Descompactar usando winzip ou winrar.
2 - Correr o ficheiro 'setup''.




Configurao inicial do programa:

Possivelmente o programa no vir por 'default' com as bibliotecas que se pretendem usar em C, portanto ter-se- que
alterar. O que devero fazer:
1 - File
2 - New source file

PAULO G. G. SOARES


3 - Se aparecer o seguinte, no tero que alterar nada, e podem passar frente...
Cdigo (C):
#include <stdio.h>
#include <stdlib.h>

int main()
{

system("PAUSE");
return 0;
}
4 - No aparecendo o cdigo anterior devero ir: Options -> Environment options


5 - Misc.
6 - Faam copy do cdigo que mostrei em 3 e colem na parte do 'default code...'

PAULO G. G. SOARES


7 - OK

Os botes mais usados (como usar o programa):

Embora o programa tenha muitos 'botes', vou apenas descrever os mais importantes e que se usam com maior
regularidade:



Como podem ver, so apenas 3 botes fundamentais:

1 - O que est dentro do rectngulo vermelho serve para abrir um novo "documento de cdigo" - "new source file".
(File - New source file - ctrl+U)

2 - O que est dentro do rectngulo verde serve para gravar. Antes de correrem o vosso programa, devero grav-lo,
pois s o gravado pode ser corrido com o compilador fechado. (File -> Save unit - ctrl+S)

3 - O que est dentro do rectngulo azul serve para correr o vosso programa. (Execute -> Compile and run - ctrl+F10)

Os ficheiros usados pelo programa:
PAULO G. G. SOARES

Sempre que abrem um novo source file e o gravam, na pasta que escolheram, surgem dois ficheiros com o seguinte
aspecto:





O primeiro o cdigo do vosso programa, o qual para ser visto no precisa de ser aberto pelo compilador, mas por
exemplo pelo bloco de notas, fazendo para tal abrir com. O segundo executa o vosso programa. Deste modo,
quando fazem um programa e o querem divulgar, obviamente que apenas divulgam o segundo ficheiro.


O que significa o cdigo inicial?

Relembrando o cdigo inicial, que aparecer sempre, desde que tenham procedido como sugeri na configurao do
programa, escrito em cima.

Cdigo (C):
#include <stdio.h>
#include <stdlib.h>

int main()
{

system("PAUSE");
return 0;
}
Os include so as bibliotecas de C a serem usadas pelo compilador, ou seja, para este reconhecer a sintaxe usada.
Devido a isto, estes tm que aparecer antes de tudo.
O int main () { d incio funo principal, principal porque aquela que gere todas as outras que possam ser criadas,
(esta funo tem que ser nica num programa!). Aps o { e antes do system(PAUSE) dever estar o vosso
programa.
O system(PAUSE) serve para parar o programa antes deste acabar de correr, pedindo ao utilizador que carregue em
qualquer tecla para continuar, em que o continuar acabar, visto que a instruo que se segue para o compilador
return 0 a qual serve para concluir o programa.
PAULO G. G. SOARES
Como podem supor acertadamente, o system(PAUSE) pode ser usado antes de outras instrues, que
seguidamente sero apresentadas, servindo sempre para o programa parar em dado momento, prosseguindo apenas
aps o utilizador carregar em qualquer tecla. No esquecer o } que serve para fechar a funo int main().

Noes bsicas para comear a programar:

V Va am mo os s e en nt t o o s si in nt ta ax xe e p pr ro op pr ri ia am me en nt te e d di it ta a: :

Todas as instrues so seguidas de ; ;, excepto casos que sero referidos mais frente.

Muitas vezes til escrever no compilador o que se est a fazer, para que mais tarde se perceba o que se fez. Para o
fazer tem que se usar comentrios, nos quais o programador escreve informaes, as quais apenas podero ser
visualizadas pelo mesmo, no source code e nunca no programa. Estes comentrios podem ser feitos em qualquer lado,
e fazem-se do seguinte modo:
Cdigo (C):
//comentrio
ou
Cdigo (C):
/*comentrio*/

Em que no primeiro comentrio, o compilador reconhece o comentrio at ao fim da linha, enquanto que no segundo,
reconhece como comentrio tudo o que estiver entre /* e */, podendo o utilizador usar vrias linhas se assim o
pretender. Como se pode depreender, prefervel usar a segunda sintaxe, pois a possibilidade de errar ser
supostamente menor. (Tenham em ateno as cores, esto l para facilitar a visualizao de potenciais erros). Alm
dos comentrios serem de elevado proveito para a compreenso futura do programa, tambm permitem ao utilizador
comentar certas partes do programa, para depois o compilador no correr essas mesmas partes. Este procedimento
normalmente usado para encontrar erros no cdigo.

A partir daqui vou introduzir exemplos de programas simples, explicando-os devidamente.
A base da programao so mtodos numricos, lgica e lgebra, como tal os dados de entrada so geralmente
nmeros, bem como os de sada. Associados a estes podem estar caracteres. O que poderemos ento fazer com isto?

Comeando por algo muito simples (e totalmente intil ):
[Para poupar espao, vou omitir a parte do "cdigo inicial", dando-vos a garantia que todo o cdigo que se segue
dever ser colocado aps o "int main() {" e antes do "system ("PAUSE");"]

Exemplo n 1
Cdigo (C):
PAULO G. G. SOARES
printf("O BENFICA campeo de Portugal e arredores!\n");
Como podem confirmar, ao colocar este cdigo no compilador, e ao correrem, aparecer-vos- a mensagem que est
entre parntesis, sem o '\n'. Sugiro que experimentem retir-lo. O que sucede que o compilador no muda de linha,
ou seja, estes chamados caracteres especiais servem para mudar de linha. Existem mais, como o caso:

\b retrocesso
\r enter
\t tabulao horizontal
\v tabulao vertical
\? ponto de interrogao
\ plica
\ aspas
%% carcter de percentagem
\\ barra

Como podem reparar, para colocar certos caracteres preciso ter um cuidado especial, isto deve-se ao facto de estes
estarem associados a certas instrues, como o caso de % %, que como ser visto mais frente, tem uma funo
especial.
Concluindo este exemplo, temos que a instruo printf serve para c co ol lo oc ca ar r m me en ns sa ag ge en ns s p pa ar ra a o o u ut ti il li iz za ad do or r q qu ue e u us sa a o o
p pr ro og gr ra am ma a. Normalmente usado para pedir input ao utilizador e para guiar este na utilizao do programa, como
compreendero com os seguintes exemplos. O modo de o usar escrever: printf( mensagem a mostrar no ecr );,
no esquecendo o ponto e vrgula no final da instruo. De referir que o uso de acentos, ou outros caracteres, no
recomendado, uma vez que o compilador no os decifra bem, como podem experimentar.
Recomenda-se ainda que de todos os caracteres especiais apresentados em cima, tenham particular interesse no que
usei no exemplo 1, visto que para uma mais fcil leitura do programa ser importante que se usem oportunas
mudanas de linha.
Exemplo n 2
Cdigo (C):
int a;
printf("Coloca um valor inteiro para a varivel \'a\'. \n"); //a
scanf("%d", &a);
printf("O valor que colocou em \'a\' foi %d.\n",a);
Comecem por experimentar usar o programa. Primeiro este pede que se coloque um valor inteiro para a varivel.
Depois de colocado o nmero, deve-se carregar no enter para que o programa receba o nmero. De seguida este
apresenta-nos o nmero colocado.

Passando para o cdigo, temos a instruo int a; que serve para indicarmos ao compilador que existe uma varivel a.
Este procedimento fundamental: no princpio do nosso cdigo devemos sempre apresentar as variveis. Primeiro
temos que dizer de que tipo essa varivel. Neste caso era um inteiro, da usar o int. Depois faz-se espao e coloca-se
um nome para a nossa varivel. Este nome no pode comear por algarismos, nem conter certos caracteres, deixo o
apelo para que usem letras (mas no o ), nmeros e o _ que d sempre jeito para dividir palavras, caso seja
PAULO G. G. SOARES
necessrio (notar que no se pode usar o espao). Tenham cuidado com o nome que do, pois existem nomes que
esto associados a certas instrues e que portanto no devem ser usados.

Alm do int para inteiros, tem-se outro tipo de variveis:

char para caracteres

double para nmeros reais

float para nmeros reais, mas com uma escala menor que o double (gasta menos bits, mas est mais limitado)

Seguidamente tem-se um printf que como explicara anteriormente serve, neste caso, para pedir ao utilizador para ele
colocar o nmero. Podem achar isto um pouco estpido, na medida em que quem usa o programa podero ser vocs e
portanto sabem o que colocaram no cdigo e portanto no precisam de instrues, mas a verdade que os programas
aumentam de tamanho e estas instrues so cruciais.

Apresenta-se ento uma instruo nova: scanf, serve para o utilizador colocar a partir do teclado um nmero/
caracter para a varivel que est dentro deste scanf. Passo ento a explicar esta sintaxe: depois de escrever scanf
abre-se parntesis e coloca-se de imediato entre aspas a simbologia de programao associada varivel. Ou seja,
sendo neste caso um inteiro (int), %d, se fosse um caracter (char) seria %c, se fosse double teramos %lf e um
float seria %g. Faz-se virgula, para de seguida colocar & seguido do nome da varivel, concluindo com o fechar de
parntesis e o inevitvel ponto e virgula. (O & nem sempre necessrio, pois por vezes trabalha-se com ponteiros, os
quais so muito teis quando se criam funes.)

Por fim, mais um printf, tendo este a particularidade de ser capaz de apresentar o valor de variveis. Para se fazer isto
basta usar a tal simbologia que indica o tipo de varivel, sendo que o compilador ao correr o programa, vai colocar no
stio onde metemos o (neste caso) %d o valor da varivel que esteja aps a mensagem, mas dentro do printf. Para
separar a mensagem da varivel, tem que se usar uma vrgula. Caso se pretenda ter vrias variveis, basta coloca-las
todas pela ordem que se desejar a serem apresentadas na mensagem. Por exemplo:

Cdigo (C):
int a=1;
double b=1.2;
char c='L';
float d=1.2;
printf("A:%d.\nB:%lf.\nC:%c.\nD:%g.\n",a,b,c,d);
Tenham em ateno no facto de que para apresentar nmeros decimais se usa o ponto e no a virgula, bem como no
facto de que enquanto num nmero, este poder ter quantos algarismos se desejar, que ser sempre apenas um
nmero, j no caso de caracteres o mesmo no acontece. Um conjunto de caracteres ser uma string, as quais sero
abordadas mais frente. Ter ainda em ateno no modo em como eu aqui fiz a declarao das variveis, usando
apenas o identificador igual (=), tendo especial ateno em que no caso de caracteres no se pode esquecer de colocar
estas entre pelicas. Este tipo de declarao muito usual e d jeito quando no se pretende que o utilizador d o valor
para a varivel, mas sim que esta tenha um valor independente do procedimento que se der ao programa, tendo o
cuidado de no repetir nomes de variveis, nem de usar variveis j definidas, em scanf, embora tal procedimento
no seja errado.

Notar que fazer int a=1; ou int a; <mudar de linha> a=1; exactamente a mesma coisa, podendo talvez por vezes
PAULO G. G. SOARES
ser prefervel usar a segunda possibilidade na medida em que o a=1; poder ser colocado em qualquer parte do
programa, o que poder em certos casos ser uma mais valia. (Nota: o <mudar de linha> no obrigatrio, mas muito
aconselhvel, na medida em que se se colocar o cdigo todo seguido, a sua leitura ser grandemente dificultada.)

Exemplo n 3
Cdigo (C):
int a;
double b,c;
printf("Introduza um valor para \'a\'.\n");
scanf("%d",&a);
printf("Introduza um valor para \'b\'.\n");
scanf("%lf",&b);
printf("O valor da soma de \'a\' com \'b\' e' %lf.\n",a+b);
c=a+b;
printf("O valor de \'c\' e' %lf.\n",c);
Como podem testar, este programa pede dois nmeros ao utilizador e depois soma-os, mostrando tambm que o que
tem na varivel c o resultado dessa soma. Peo primeiro ateno para a inicializao das variveis, em que digo que
b e c so do tipo double, sem que para isso tenha que escrever duas vezes double, ou seja, pode-se agrupar todas as
variveis que se tenham do mesmo tipo, separadas por virgulas. O outro procedimento ( double b; <mudar de linha>
double c) igualmente correcto, mas convm sempre economizar espao, tempo e trabalho. Como depois podem
constatar, possvel colocar uma operao dentro do prprio printf, embora eu no recomende tal procedimento.
Realo ainda outra questo: sendo b do tipo double, mas a do tipo int, convm que o resultado da soma venha em
double, como penso ser evidente, embora seja um erro algo frequente, que no se tenha o cuidado de verificar se a
varivel resultado est em consonncia com o tipo de variveis das quais depende.
Alm da operao soma (e atribuio =), temos tambm:

- -> Subtraco
* -> Multiplicao
/ -> Diviso (inteira)
% -> Resto da diviso
++ -> Incremento
-- -> Decremento

As ltimas duas possvel que no percebam para que sirvam, mas so a mesma coisa que ter:

X=X+1;
X++;

De modo similar para o decremento.
PAULO G. G. SOARES
Como j podem ter reparado, eu fiz sempre a atribuio de uma varivel do lado esquerdo, para algo que est do lado
direito, ou seja, correcto fazer: a=2+3;, mas incorrecto fazer 2+3=a;.
Quanto ao que fiz em cima, muito usual faz-lo em ciclos, como podero ver mais frente, refiro-me ao incremento,
em que se soma uma unidade varivel x.
Referi-me diviso, como sendo diviso inteira, isto porque se fizerem:
A=3/2;
O resultado no ser 1.5, mas 1, ou seja, a parte inteira do resultado. Caso se pretenda o nmero real, ter-se- que
fazer A=(double) 3/2;. Notar que o % usa-se do seguinte modo:
D=3%2;
O resultado de D ser 1, isto porque se fizermos a diviso de 3 por 2, o resto inteiro ser 1.

Como na matemtica, tambm aqui existe a precedncia de operadores:
Parntesis sobrepe-se a tudo, segue-se a multiplicao, diviso e resto da diviso, acabando na soma e subtraco, ou
seja, exactamente como a matemtica, a diferena surge nos operadores incremento e decremento.

Vejamos o prximo exemplo:

Exemplo n 4
Cdigo (C):
int a,b;
double c,d;

a=2;
b=6;
c=1.5;
d=--a*b/c+a*c+++a--;
printf("%lf\n %lf \n %d \n",d,c,a);
Se correrem, vero que d ser igual a 6.5, c igual a 2.5 e a igual a 0.

Ora isto parece no fazer sentido, pois se logo no princpio subtrado a a uma unidade, este ao multiplicar por c
deveria ser neutro, mas tal no acontece, embora ao operar sobre a diviso de b por c, j toma o valor de 1. Ou seja, o
que se passa , comeando pelo fim, a- - s feito aps o ciclo, pois caso se o retirarmos, podem ver que o valor de d
passa para 5.5, ou seja, o a valia 1 e no zero, ou seja, o decremento s feito depois da soma com tudo o resto.
Antes disso, sabemos pelo valor que toma o c e d, que a j era 1, ou seja, o decremento - -a j tinha sido feito,
assim podemos concluir de tudo isto que o decremento/ incremento feitos atrs da varivel (-- a) tm precedncia em
relao multiplicao, enquanto o decremento/ incremento feitos a seguir varivel so os ltimos a serem feitos,
mesmo aps a adio/ subtraco. Quem no percebeu, que tente exemplos no compilador, que rapidamente ir
compreender.
PAULO G. G. SOARES

Para outras operaes que se desejem, como a raiz, expoente, logaritmo, etc, dever ser includa uma biblioteca que
contenha essas funes (por exemplo #include <math.h>).

Exemplo n 5 Instrues Condicionais
Cdigo (C):
int a,b;
char i;

printf("Quer somar ou subtrair dois nmeros?\nSe quer somar, clique 1 e \'enter\'.\nSe quer
subtrair, clique outra tecla que no 1 e \'enter\'.\n");
scanf("%c",&i);
if (i=='1')
{
printf("Coloque dois nmeros inteiros.\n");
scanf("%d", &a);
scanf("%d", &b);
printf("A soma de %d com %d %d.\n",a,b,a+b);
}
else
{
printf("Coloque dois nmeros inteiros.\n");
scanf("%d", &a);
scanf("%d", &b);
printf("A subtraco de %d com %d %d.\n",a,b,a-b);
}

O que podem fazer com este programa? Somar ou subtrair dois nmeros, podendo escolher o que fazer. Ou seja,
existe uma condio. Se o utilizador colocar 1, o programa ir seguir um certo rumo, se colocar outra coisa, ir seguir
outro rumo. Para isto se tem l o if, que como sabem significa se, ou seja, se o utilizador colocar 1 na varivel i, ir
seguir o rumo que est entre { }, se no far o else que significa seno, ou seja, se i no 1, ento ir fazer o que
se segue entre {}.

Por outras palavras, a sintaxe da condio muito simples e intuitiva:

if (condio) /*condio tem que estar entre parntesis*/
{ instrues }
else {
instrues}


Notar que o else pode ser omisso, quando se pretenda que o programa no faa nada, caso a condio no se
PAULO G. G. SOARES
verifique.
Quanto condio, temos == ou seja, significa que o que est de um lado igual ao que est ao de outro, portanto
nada tem a ver com a atribuio =, pois nesse caso estar-se-ia no a verificar uma condio, mas a cri-la, sendo
sempre certa, portanto no esquecer que numa condio de igualdade no se usa =, mas sim ==.

Podemos ter outras condies, como:

> maior

< menor

>= maior ou igual

<= menor ou igual

!= diferente

Alm do if, temos tambm o switch, que serve para seleco mltipla, ou seja, para quando se quer colocar vrios
casos, e o uso do if se torna um pouco trabalhoso e espaoso no programa.
Vejamos ento o prximo exemplo.
Exemplo 6 - switch
Cdigo (C):
int a,b,c,i;
a=1;
b=2;
c=3;
printf("Se deseja somar 1 com 1, clique 1.\nSe deseja subtrair 3 com 2, clique 2.\nSe deseja
multiplicar 1 com 3, clique 3.\n");
scanf("%d",&i);
switch (i)
{
case 1:
c=a+a;
printf("1+1=%d\n",c);
break;

case 2:
a=c-b;
printf("3-2=%d\n",a);
break;

case 3:
b=a*c;
printf("1*3=%d\n",b);
PAULO G. G. SOARES
break;

default:
printf("Ups, no existe essa opo.\n");
break;

}

Como podem constatar, se fossem meter um if para cada caso, dava-vos mais trabalho, alm de piorarem a leitura do
programa. O modo de usar o switch tambm intuitivo:
switch (varivel a verificar) {
case /*caso*/ valor_que_a_varivel_pode_tomar /*notar que se fosse um carcter necessitaria das plicas*/
instrues /*aqui no necessrio o uso dos parntesis { } */
break; /*serve para terminar o caso*/
(um todo outro conjunto de cases, e caso se queira: )
default: /*para todos os outros casos no includos nos anteriores, ou seja, como se fosse um else*/
instrues
break;
} /*fim do switch*/

O if muito importante tambm para uma outra coisa: e se o utilizador se engana a colocar, no exemplo anterior um
nmero, ou seja, por exemplo, em vez de um nmero coloca um carcter. Ora, com o if poder-se- verificar se o
utilizador se enganou e mand-lo recolocar o nmero, caso tal tenha acontecido, no entanto, como podem pensar,
este tipo de procedimento no faria sentido, pois o utilizador poderia continuar a enganar-se e ns que fazemos o
cdigo, no saberamos quantos if, precisaramos, para isso sero de grande utilidade as condies repetitivas, ou seja,
ciclos, que sero vistos de seguida.

Exemplo n 7 ciclos
Cdigo (C):
int i,a;

a=1;
while(a){
printf("Coloque o nmero 1.\n");
fflush(stdin);
scanf("%d",&i);
if (i==1)
a=0;
}
Antes de mais, importa dizer que em programao, 1 significa verdadeiro e 0 falso.
Como sabem, while significa enquanto, portanto, enquanto uma certa condio, o ciclo que se segue ser
processado, ou no. Como podem depreender pelo o que disse inicialmente e pelo cdigo que apresento, while
PAULO G. G. SOARES
(verdadeiro) faz correr as instrues que o ciclo tem dentro dos parntesis { }. Dentro do while o que tenho um printf
que no levanta dvidas, seguido de um fflush(stdin);. No vou perder muito tempo a explicar o que isto , digo-vos
apenas que deve ser usado quando se d a uma certa varivel valores segundo ciclos, ou seja, serve para limpar a
memoria, pois se experimentarem a neste caso a retirarem isto e a correrem o cdigo, se na primeira vez se no
colocarem o 1, ento no tero oportunidade de voltar a tentar, pois comear a aparecer sem parar a mensagem do
printf, ou seja, o scanf feito automaticamente com a memoria do que foi colocado automaticamente, assim, se a
memoria for limpa em cada ciclo, o programa chega ao scanf e volta a precisar que o utilizador d um novo valor para
a varivel i.
Seguidamente tenho um if, em que vai ver se o que foi colocado foi mesmo o 1 que se pretendia, se foi, ento ser
processada a instruo: a passar a ser igual a 0. Ento, ao voltar ao while, a condio deixar de ser verdadeira, para
ser falsa, logo o que est dentro do while no ser corrido, e portanto o programa acabar, visto que no tem nada
mais alm do while.
Com este artifcio (ou com algo similar), podero verificar sempre se o que foi colocado pelo utilizador est correcto.
Se no perceberam, no se preocupem, que utilizarei esse procedimento em exemplos posteriores.
Algo tambm muito usual, querer fazer um ciclo que repita um dado nmero de vezes.
Como podero ver no seguinte exemplo:

Exemplo n 8

Cdigo (C):
int a,contador,c;
contador=0;
a=2;
printf("Vejam a tabuada do 2:\n");
while(contador<10)
{
contador++;
c=a*contador;
printf("%d\n",c);
}

Como podem ver, o ciclo ir ser executado at que o contador tenha adquirido o nmero 10.
Um outro modo de fazer exactamente a mesma coisa e que encurta espao usar um ciclo for.
No prximo exemplo mostro um programa um pouco mais complexo e que engloba algumas das coisas que j referi
que estes ciclos permitem fazer, alm de um outro tipo de ciclo parecido com o while, que o do while.

Exemplo n 9

Cdigo (C):
PAULO G. G. SOARES
int a, contador, b;
do{
printf("Introduza o nmero positivo e menor que 100 para o qual pretende ver a tabuada.\n");
fflush(stdin);
scanf("%d",&a);
} while (a<=0 || a>=100);
printf("Tabuada do %d:\n",a);
for(contador=1; contador<11; contador++)
{
b=contador*a;
printf("%d\n",b);
}
Suponho que estejam a pensar: finalmente algo pode ser minimamente til, a verdade que com os conhecimentos
que j tm, podero j efectuar programas bem teis, principalmente para quem trabalha com somatrios, os quais
no passam de um ciclo como estes que tenham apresentado.
Mas voltando ao cdigo, como podem comprovar, este programa comea por pedir um nmero entre 1 e 99, sendo
que se no o colocarem, ele voltar a pedir at que lhe faam a vontade. Se experimentarem a retirar a condio do
while, verificam que se colocarem uma letra, o programa pegar num nmero esquisito e far a tabuada desse. Ora
isto deve-se ao cdigo ascii, no qual a cada carcter est associado um nmero. No fim de lerem este tutorial e de o
testarem, sugiro (caso ainda tenham vontade) que pesquisem no google por esse cdigo e depois tentem fazer
programas com base nesse cdigo de modo a poderem manipular como desejarem os caracteres.
Ora, temos ento aqui algo novo: do{ instrues} while( condio || condio);. Este tipo de ciclo muito semelhante
ao while, tendo a particularidade de que a condio apenas testada no fim das instrues serem corridas e no o
contrrio, o que implica que a primeira vez ser sempre corrida, independentemente das condies. Na parte da
condio est l algo que me esquecera de referir logo nos ifs: podemos ter mais que uma condio, separadas por ||
(duas barras verticais) que significa ou, ou ento separadas por && que significa e. Podem ento questionar: neste
caso era suposto termos uma condio <e> outra e no uma <ou> outra, como l est. No entanto, como podem
verificar: o ciclo ser repetido se a condio for verdadeira, e no repetido quando for falso, deste modo, o que se
pretende que o utilizador coloque algo que satisfaa a negao da condio. (Para quem no percebeu, recomendo
vivamente que estude um pouco de lgica, ou que me pea para a explicar em mais detalhe.)

Seguidamente o programa faz o mesmo que o do exemplo 8, com a diferena que em vez de se usar o while, usa-se for
(para), o qual tem uma sintaxe um pouco mais complicada e menos intuitiva.
Ora bem um for funciona do seguinte modo:
for (inicio; condio; incremento/ decremento que altera a varivel de inicio)

{ instrues

}

Ou seja, um for uma forma condensada de fazer o mesmo que se fazia com o while nas situaes em que se usava
um contador. Notar que no local da condio podemos, ter vrias, bem como no inicio podemos ter varias variveis de
inicio, as quais so alteradas por mais expresses no local a seguir condio.
PAULO G. G. SOARES

Exemplo n 10

Cdigo (C):
int i,j,a,contador;

for(i=0, j=6,contador=1; i<10 && j>3; i++, j=j-i,contador=contador+1)
{
a=j*i;
printf("\'a\' toma o valor de %d no ciclo nmero %d\n",a,contador);
}
Como podem ver, podem-se ter vrias variveis dentro da parte do inicio, bem como da do incremento/ decremento,
separadas por virgulas. Talvez seja importante interpretar este ciclo do ponto de vista do compilador, visto que ainda
no o fiz e podem residir dvidas sobre isso:

Primeiro ciclo:
Inicializado i=0, j=6 e contador=1.
So verificadas as condies:
i menor que 10, visto que i 0, j maior que 3, visto que j 6.
a=i*j, ou seja, a=0*6=0.
Segundo ciclo:
executada a instruo de incremento/ decremento:
i++, ou seja, i=0+1=1
j=j-i, ou seja, j=6-1=5
contador=2 (notar que esta varivel serve para que no printf se indique o numero do ciclo)
So verificas as condies:
i continua menor que 10 e j continua maior que 3
a=i*j, ou seja, a=1*5=5.
Terceiro ciclo:
i++, ou seja, i=1+1=2
j=j-i, ou seja, j=5-2=3
contador=3

As condies so apenas parcialmente verificadas, ou seja, embora o i continue inferior a 10, mas o j deixou de ser
superior a 3. Deste modo, as instrues dentro do for no so executadas. Falta ainda explicar melhor a instruo
break, bem como a continue, para isso vejamos o prximo exemplo:

Exemplo n 11
Cdigo (C):
PAULO G. G. SOARES
int c;
do
{
printf("Coloque um nmero para ver o seu dobro.\nColoque 0 para sair.\nSe colocar -1 para voltar
a esta opo\n");
fflush(stdin);
scanf("%d",&c);
if (c==0)
break;
if (c==-1)
continue;
else
{
printf("O dobro de %d, %d\n",c,c*2);
}
}while(1);
Este exemplo serve apenas para introduzir o continue e consolidar o break. Como podem constatar ao usar o
programa, ao carregarem -1, o programa volta atrs, ou seja, executado o continue, o qual tem a funo de passar
frente de tudo o que haja no ciclo, passando para a iterao (repetio) seguinte, no caso de um for, o continue iria
fazer com que a condio de incremento/ decremento fosse executada e de seguida a condio de teste para que a
iterao seja executada, ou no. O break, tal como no switch, produz uma sada imediata do ciclo, seja ele while, do
while, ou for.
Um parte: proponho vivamente que quem est a ver programao pela primeira vez, e tem estado a seguir tudo at
agora apenas copiando o cdigo que tenho colocado, deva fazer uma pausa e comear a tentar fazer coisas que
pensem, ou se no tm nenhuma ideia do que fazer, proponho que tentem fazer este exemplo simples: criar um
programa que faa a mdia das vossas notas. Tentem complicar ao mximo, usando tudo o que j supostamente
aprenderam, ou podiam ter aprendido, ou seja, faam um controlo dos dados de entrada do utilizador, sem saber
quantas notas sero colocadas, mas usando um valor bandeira, como no exemplo 10. Se depois necessitarem, eu
poderei colocar a soluo do problema.
Se fizeram o que propus, talvez comecem a sentir falta de algo: vectores/ matrizes. No de modo algum vivel criar
cem variveis, apenas porque se pretende manipular cem valores, portanto convm criar algo que as armazene, sem
que sejam variveis para cada valor.
Para quem nunca teve lgebra, possvel que desconhea o que um vector, nesta situao, podendo estar a associar
aos vectores da fsica, os quais esto relacionados, mas para agora, o melhor considerarem que um vector neste
contexto um conjunto de nmeros dispostos em linha, ou coluna. Uma matriz ser uma tabela de nmeros, com
duas ou mais dimenses.

Exemplo n 12 Vectores
Cdigo (C):
int i,recibos[5],soma=0;
for(i=0; i<5; i++)
PAULO G. G. SOARES
{
printf("Coloque o valor que recebeu\n");
scanf("%d",&recibos[i]);
}
printf("Tudo o que recebeu foi:\n");
for(i=0;i<5;i++)
{
printf("%d\n",recibos[i]);
soma=soma+recibos[i];
}
printf("Tudo somado d:%d\n",soma);

Temos ento a inicializao de algo novo: recibos[5]. Ser ento um vector com memria para 5 inteiros. Do mesmo
modo se podia criar um float ou double, (quanto a char, outra conversa, tratar-se- de uma string, das quais falarei
no exemplo seguinte).
Como podem reparar, para usar um vector, normalmente tem que se usar um ciclo, pois s deste modo se poder
percorrer o vector de modo a preench-lo. Um dado importante o facto de i comear em zero e acabar em 4, em vez
de comear em 1 e acabar em 5, como se poderia esperar. Em C tem-se que o ndice do vector comea em zero e
acaba uma unidade antes do seu comprimento. Notar que o nmero que faz de ndice tem que ser um inteiro, caso
contrrio, o programa dar erro. Outro dado importante que o vector tem que ser definido logo no incio, o que
implica algo que pode ser constrangedor: temos que saber at onde poder ir o utilizador, dando a este um limite.
Podem experimentar a alterar a condio no for, para que o i v mais longe. Apesar de no dar erro, e de o programa
parecer correr na perfeio, com o vector a ser aumentado alm do que previamente fora predefinido, tal
procedimento errado e noutros casos causar erros.

Exemplo n 13 Strings
Cdigo (C):
char frase[100];

printf("Escreve alguma coisa, at um mximo de 100 caracteres.\n");
gets(frase);

printf("O que escreveu foi:\n");
puts(frase);

printf("\nA frase escrita teve %d caracteres.\n",strlen(frase));
Como podem deduzir, o gets como que um scanf, mas para um conjunto de caracteres, sem precisar de criar um
ciclo, como se fez para os vectores, embora tal procedimento esteja correcto. No entanto, se fizerem tal coisa, tenham
em ateno algo que distingue uma string, de um vector de caracteres: a string precisa de um ltimo espao para um
caracter especial que indica o fim da string: \0. Deste modo a string indicada no ter espao para 100 caracteres,
mas sim para 99. Caso usem um ciclo, que por vezes d jeito, no se esqueam portanto de na ltima iterao
colocarem o \0 na string, seno esta no ser uma string, mas sim um vector de caracteres o que significar que no a
podero manipular como tal.
PAULO G. G. SOARES
O puts, como podem deduzir tambm, como que um printf especfico para strings.
No ltimo printf aparece outra coisa nova: strlen. Uma funo que serve para verificar qual o tamanho de uma string.
Notar que esta funo devolve sempre um nmero inteiro.
Para poder manipular strings de um modo mais amplo, convm adicionar uma biblioteca: #include <string.h>. Caso
tenham interesse nisto, procurem nos links que esto no final do tutorial esta biblioteca, para verificarem quais as
suas potencialidades. Acrescento ainda que uma string funciona como um ponteiro, da, caso se no pretenda usar o
gets, pode-se usar na mesma o scanf, da seguinte forma: scanf(%s, frase); notar que no leva o &, por se tratar de
um ponteiro, por outro lado o tipo string usa %s para ser invocado, do mesmo modo que num printf se pode colocar o
%s para mostrar o que contem a string.
Exemplo n 14 Funes
Cdigo (C):
#include <stdio.h>
#include <stdlib.h>

double factorial(double x)
{
int i,n;
double y;
for (i=1; i<=x; i++)
{
y=i;
for (n=1; n<i; n++)
y=y*n;
}
return y;
}


int main()
{
double a;
printf("Coloque um nmero para ver o seu factorial.\n");
scanf("%lf",&a);
printf("O factorial de %lf e' %lf.\n",a,factorial(a));


system("PAUSE");
return 0;
}

Antes de mais, espero que saibam o que o factorial de um nmero. Como podem ver, uma funo apresenta-se fora
do int main, ou seja, fora da funo principal, exactamente porque uma funo. Esta funo pode ser chamada
sempre que se deseje, sem que alguma vez seja alterada. Qual a estrutura de uma funo?
PAULO G. G. SOARES

<Tipo de dado de sada> <nome da funo> (<tipo do dado de entrada> <nome que o dado de entrada tomar dentro
da funo> ) /*poder ser mais que um que dado, sendo que nesse caso estaro separados por vrgulas*/
{ intrues, notar que as variveis aqui so independentes do int main, e tm que ser inicializadas, tal como o so na
funo principal ;
return <varivel que se pretenda que seja o output da funo>;
}

Notar que a funo no precisa de obrigatoriamente ter output. Nesse caso no poderemos definir o tipo de varivel
ser o de sada, logo no princpio. Nesses casos usa-se void, ou seja, no stio onde colocariam o tipo de varivel de
sada, colocam void.

Do mesmo modo uma funo pode no ter dados de entrada, ficando por isso livre o espao entre parntesis aps o
nome da funo, no podendo por isso omitir o parntesis. Acrescento ainda que no de modo algum incorrecto
usar scanf, printf, etc, dentro de uma funo. A nica coisa que no pode ser esquecida, que a funo s ser corrida
atravs do int main, portanto no esquecer de a a chamar, para ela ser executada.

Para chamar a funo, basta usar o nome que lhe foi dada, colocando a seguir a este entre parntesis os valores de
entrada, caso os tenha, caso no os tenha, colocam-se apenas o parntesis.

S-ar putea să vă placă și