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

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.

r. 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 partes de um programa podem ser escritas em diferentes linguagens. 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. Para mais informaes sobre estes mtodos, veja Linguagem de programao. Software um nome colectivo para programas de computadores e dados. H vrias dcadas que se debate ferozmente sobre se a programao mais semelhante a uma arte (Donald Knuth), a uma cincia, matemtica (Edsger Dijkstra), engenharia (David Parnas), ou se um campo completamente novo.

O que um algoritmo? Um algoritmo , num certo sentido, um programa abstracto - dizendo de outra forma, um programa um algoritmo concretizado. 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 operao simples e especfica, como, por exemplo, uma ordenao. Um programa, por outro lado, uma entidade que na verdade implementa uma ou mais operaes de forma que seja til para as pessoas.

Histria: C uma linguagem de programao estruturada e padronizada criada na dcada de 1970 por Dennis Ritchie e Ken Thompson para ser usada no sistema operacional UNIX. Desde ento espalhou-se por muitos outros sistemas operativos, e tornou-se uma das linguagens de programao mais usadas. C tem como ponto-forte a sua eficincia e a linguagem de programao de preferncia para o desenvolvimento de software de sistemas, apesar de tambm ser usada para desenvolver aplicaes. tambm muito usada no ensino de cincias da computao, mesmo no tendo sido projectada para novatos.

Em que consiste? C uma linguagem de programao relativamente minimalista que opera bem prximo do hardware, e mais semelhante linguagem assembly do que as restantes linguagens. Certamente, C por vezes referida como uma "assembly porttil". O cdigo de C pode ser compilado para ser rodado em quase todos os computadores/sistemas operativos. C tpicamente chamada de uma linguagem de baixo nvel ou de nvel mdio, indicando assim o quanto perto ela opera com o hardware. Essa propriedade no foi acidental; 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 autor do compilador de C, cujo trabalho complica-se ao ter de realizar as caractersticas complexas da linguagem.

Vantagens: Para este fim, a linguagem C possui as seguintes caractersticas: * Uma linguagem nuclear extremamente simples, com funcionalidades noessenciais, tais como funes matemticas ou manuseamento de ficheiros (arquivos), fornecida por um conjunto de bibliotecas de rotinas padronizada. * A focalizao no paradigma de programao procedimental * Um sistema de tipos simples que evita vrias operaes que no fazem sentido * Uso de uma linguagem de pr-processamento, o pr-processador de C, para tarefas tais como a definio de macros e a incluso de mltiplos ficheiros de cdigo fonte. * 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: Algumas caractersticas teis que faltam linguagem C mas que so encontradas em outras linguagens incluem: * Segurana de tipo * Colecta automtica de lixo * Classes ou objectos com comportamento (ver programao orientada por objectos) * Um sistema avanado de sistema de tipos

* * * * *

Funes aninhadas Programao genrica Sobrecarga de operadores Meta-programao Apoio nativo de multithreading e networking

Apesar da lista de caractersticas teis que C no possui ser longa, isso no tem sido um impedimento sua aceitao, pois isso permite que novos compiladores de C sejam escritos rapidamente para novas plataformas, e tambm permite que o programador permanea sempre em controle 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. Tipicamente, s cdigo de assembly "afinado mo" que corre mais rapidamente, pois possui um controle completo da mquina, mas avanos na rea de compiladores juntamente com uma nova complexidade nos processadores modernos permitiram que a diferena tenha sido rapidamente eliminada. 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. [adaptado do wikipedia]

Para que serve este tutorial e a quem dirigido? Serve para ficar com uma ideia muito bsica de como programar na linguagem C, ficando com noes suficientes para poder criar programas tambm eles bsicos nesta linguagem. Obviamente que quem j sabe programar em C, no vai aprender aqui nada. Eventualmente quem sabe programar noutras linguagens, poder comparar as diferenas de sintaxe entre esta linguagem e as suas conhecidas. No entanto, este tutorial dirigi-se mais a quem nunca teve programao, mas tem curiosidade e ansia de aprender alguma coisa nesta linguagem.

Onde programar? Como j foi dito anteriormente, usa-se um compilador. Podero fazer o download daqui: http://sourceforge.net/projects/dev-cpp/ Info: Source code : Delphi Source code of Dev-C++ is available for free under the GNU General Public License (GPL) Authors : Colin Laplace : Main IDE Development; Hongli Lai: IDE updates, splash screen and icons Mingw: Mumit Khan, Jan Jaap van der Heidjen, Colin Hendrix and GNU coders. System : Windows 95/98/NT/2000 Status : Free Software (under the GNU General Public License) Size : 7.5 Mb

Instalao do Dev-C++4: 1 - Descompactar usando winzip ou winrar.[O winrar tem instalao simples, basta fazer "next"...] 2 - Correr o ficheiro 'setup''.

3 - Na janela de intalao proceder do seguinte modo: clicar 'yes' -> escolher 'typical' e 'next'. (Podero alterar o directrio para onde ser instalado o programa, usando o 'browse'.

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

3 - Se aparecer o seguinte, no tero que alterar nada, e podem passar frente desta parte do tutorial.

Cdigo: #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 em 3 mostrei e colem na parte do 'default code...'

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 (mais explicaes a seguir sobre os ficheiros). (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: Sempre que abrem um novo source file e o gravam, no directrio 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: #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, (excepto de comentrios, que mais frente explicarei o que so e como fazer).

O int main () { d incio funo principal, principal porque aquela que gere todas as outras que possam ser criadas como mais frente ser explicado, (esta funo tem que ser nica num programa!). Aps o { e antes do system(PAUSE) dever estar o vosso programa, embora se possa contornar esta regra sem qualquer problema, como podero confirmar quando j dominarem minimamente C, mas deixo o conselho que de inicio o no tentem, pois possivelmente no dar o resultado esperado. 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. 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: Vamos ento sintaxe propriamente dita: 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: //comentrio

ou Cdigo: /*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, quer nesta, quer noutras instrues que seguidamente apresentarei. Alm de os 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 opto por introduzir exemplos de programas simples, explicandoos 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: printf("Que porcaria de tutorial!\n");

Como podem confirmar, ao colocar este cdigo no compilador, e ao correrem, aparecer-vos- a mensagem que est entre parentesis, sem o '\n'. Sugiro que experimentem a 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 %% caracter de percentagem \a ou \7 - bell \\ - 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. ( possvel que alguns no funcionem em certos compiladores, nomeadamente no que eu propus que sacassem.) Se no perceberam para que servia algum, o melhor ser experimentarem e verem. Concluindo este exemplo, temos que a instruo printf serve para colocar mensagens para o utilizador que usa o programa. 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 ecrn );, no esquecendo o ponto e virgula no final da instruo. Quero ainda referir, que o uso de acentos, ou outros caracteres, no recomendado, uma vez que o compilador no os decifra bem, como podem experimentar. Recomendo ainda que de todos os caracteres especiais apresentados em cima, tenham particular interesse no que usei no exemplo 1, visto que para um mais fcil leitura do programa ser importante que se usem oportunas mudanas de linha.

Exemplo n 2 Cdigo: int a; printf("Coloca um valor inteiro para a variavel \'a\'. \n"); scanf("%d", &a); printf("O valor que colocou em \'a\' foi %d.\n",a);

Comecem por experimentar a 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 (salvo excepes que agora no interessam) 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, que creio no valer a pena referir quais so especificamente, deixo apenas o apelo para que usem letras (mas no o ), nmeros e o _ que d sempre jeito para dividir palavras, caso seja necessrio (notar que no se pode usar o espao). Acrescento ainda que 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, no entanto eles no sero tratados neste tutorial, quem quiser saber o que so e para que servem, perguntem depois, ou pesquisem nos links que indico no final do tutorial.) 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: 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 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 colocar o cdigo todo seguido, a sua leitura ser grandemente dificultada.)

Exemplo n 3 Cdigo: 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. 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: 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 principio 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 que 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. 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:

int a,b; char i; printf("Quer somar ou subtrair dois numeros?\nSe quer somar, clique 1 e \'enter\'.\nSe quer subtrair, clique outra tecla que nao 1 e \'enter\'.\n"); scanf("%c",&i); if (i=='1') { printf("Coloque dois numeros inteiros.\n"); scanf("%d", &a); scanf("%d", &b); printf("A soma de %d com %d e' %d.\n",a,b,a+b); } else { printf("Coloque dois numeros inteiros.\n"); scanf("%d", &a); scanf("%d", &b); printf("A subtraccao de %d com %d e' %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 omitido, quando se pretenda que o programa no faa nada, caso a condio no se 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 haver 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: int a,b,c,i; a=1; b=2; c=3; printf("Se deseja somar 1 com 1, clique 1.\nSe deseja subtair 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); break; default: printf("Ups, nao existe essa opcao.\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 caracter necessitaria das pelicas*/ 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 caracter. 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: int i,a; a=1; while(a){ printf("Coloque o numero 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 (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 , digovos 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: 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: int a, contador, b; do{ printf("Introduza o numero 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 caracter 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.

Exemplo n 10 Cdigo: int i,j,a,contador; for(i=0, j=6,contador=1; i<10 && j>3; i++, j=ji,contador=contador+1) { a=j*i; printf("\'a\' toma o valor de %d no ciclo numero %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: int c; do { printf("Coloque um numero para ver o seu dobro.\nColoque 0 para sair.\nSe colocar -1 para voltar a esta opcao\n"); fflush(stdin); scanf("%d",&c); if (c==0) break; if (c==-1) continue; else { printf("O dobro de %d, e' %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. No irei mostrar como usar matrizes, mas se pedirem, depois poderei dar um exemplo usando-as.

Exemplo n 12 Vectores Cdigo: int i,recibos[5],soma=0; for(i=0; i<5; i++) { 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 da:%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: char frase[100]; printf("Escreve ai alguma coisa, ate um maximo 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. 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>. 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: #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 numero 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? <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 virgulas*/ { 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 os 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 os parntesis.

Bem, dou as explicaes por concludas, apesar de haver ainda muita coisa por falar, como o uso de estruturas - struct, a manipulao de ficheiros, nomeadamente de .txt, ponteiros, e todo um conjunto de particularidades que se poderiam acrescentar ao que disse, isto entre muitas outras coisas mais complexas e que podero aprender apenas com a fora da curiosidade e vontade de aprender mais. Receio que a dada altura do tutorial comearam a ver que as minhas explicaes eram mais descuidadas, mas tal foi propositado, visto que se no entendem por poucas palavras, com algumas ideias implcitas que devem deduzir por vs, tal significa que o que est para trs no est totalmente assimilado, como tal devem voltar atrs e analisarem o que no perceberam, podendo recorrer a outros meios, alm deste tutorial. O conselho mesmo: experimentar e tentar inventar por vs. Programar no se aprende lendo, mas sim programando!

Оценить