avanada em Recife / PE PR!R"#"$% E# & - '(ve) 01 *o)tado para ambientes Linu+ "ten,o- Este documento pertence ao grupo de estudos intitulado FDL06_1 e foi escrito por Gnese Lessa vulgo slackwareFDL, que atualmente est ministrando o curso de C no primeiro mdulo. Todos os direitos deste texto esto sob licena GPL, ou seja, vc pode alterar, vender, publicar, trocar, emprestar, ceder, repassar, ou qualquer outra coisa que vc desejar fazer, desde que os crditos dos autores permaneam inalterados e estejam presentes nos prximos possveis volumes deste texto. .ndice- 1. Introduo 2. Tipos do C - Variveis bsicas 3. Operadores bsicos 4. Arrays ou matrizes 5. Introduo s funes 6. Comentrios 7. Funes de entrada e sada 8. Condicional if() 9. Loops ou laos: for() e while() 10. Mais variveis... escopo 11. Diretivas de pr-processamento: #include e #define 12. Um pouco sobre funo main() 13. Concluso 1/ 0ntrodu,o- Seja bem vindo amigo newbie; isto mesmo, este texto foi escrito para iniciantes e se vc se considera elite, aconselho no ler este txt, pois o contedo aqui C bsico. Mas caso vc no seja um fuador experiente e deseja encontrar uma documentao de fcil aprendizado para a linguagem C, eu tenho uma proposta, faamos isso juntos, pois enquanto eu escrevo esta apostila estou tbm aprendendo C. Mas, deixemos de conversa fiada e vamos ao que interessa... O que vem a ser um programa de computador? Programa o nome dado a um conjunto de instrues capazes de realizar determinada tarefa. Os programas podem ter propsitos genricos (planilhas eletrnicas, editores de texto, etc) ou podem ser altamente especficos (kernel de sistema operacional, funes para manipulao de memria, etc). Na verdade quando falamos em programas, estamos falando de arquivos cujo contedo pode ser entendido pelo computador. "H? Como assim?", calma... que quando usamos uma linguagem de programao estamos utilizando meios de escrita que se aproximam demais da escrita humana (muito diferente dos dgitos binrios que o PC entende...). Uma linguagem como o C, por exemplo, uma LP (Linguagem de Programao) baseada no bom e velho ingls. Antes de um programa escrito em C poder ser executado, ele deve passar por um processo conhecido como compilao. A compilao ocorre graas a um tipo especial de programa chamado compilador, que tem por funo "traduzir" o que est escrito em C para os valores binrios entendveis pelo computador. O arquivo contendo o programa em estado entendvel pelos seres humanos habilitados na linguagem de programao o chamado cdigo fonte. Baseado nestas instrues, podemos dar prosseguimento ao nosso curso. Vamos l... 1/ 2ipos em & - *ariveis bsicas Primeiramente gostaria de ressaltar que o C uma linguagem case sensitive, ou seja, maisculas diferem de minsculas. Exemplo: Genese diferente de genese ou GeNeSe... Agora vamos ao C em si... O C considerado uma linguagem de difcil aprendizado, ou seja, o cara se ferra mesmo, se quiser dominar o C, mas no eh nada que seja impossvel de fazer. At pq o C no eh uma linguagem com milhes de tipos, pelo contrrio, poucos tipos existem, vc deve prestar mais ateno nos conceitos, estes sim fazem muita diferena. Por exemplo vamos falar sobre alguns conceitos bsicos em C. Variveis: as variveis so espaos reservados na memria que podem armazenar dados de determinado tipo e que possuem um nome para se referenciar a ele. Os tipos bsicos de variveis so: int = nmeros inteiros char = caracteres float = nmeros decimais ou fracionrios void = tipo vazio ou sem tipo double = pode ser visto como um float com mais preciso Vejamos abaixo como proceder para declarar uma varivel: tipo nome_da_varivel = valor; ou tipo nome1, nome2, nome3, ... , nomeX; Primeiramente escrevemos o tipo da varivel (ocorre em respeito a gramtica nativa da linguagem C, o ingls) seguido do nome ou nomes das variveis, pois eu posso declarar mais de uma varivel de uma vez, basta separar os nomes por vrgulas. Em seguida pode-se atribuir um valor a(as) varivel(variveis), logicamente este valor deve condizer com o tipo da mesma. Em relao ao nome, existem algumas regras bsicas a seguir: 1: o nome deve comear com um sinal de underline (_) ou um caracter alfabtico, nunca por um nmero; 2: nunca acentue nomes de variveis, pois, a sintaxe original eh em ingls, no existindo acentos do nosso idioma; 3: existe uma modalidade adotada por muitos programadores e que constitui uma boa prtica de programao na declarao das suas variveis. Consiste em iniciar as possveis palavras usando letras em maisculas. Ex: int minhaVariavelEstaBemDeclarada; Obviamente o mtodo acima eh bem citado no caso de nomes extensos de variveis. Note o smbolo (;) no final da declarao. Este ponto-e-vrgula usado no final das declaraes e chamadas de funes em C. De posse destas informaes, podemos estudar sobre os tipos bsicos em C: * int: armazena (refere-se) a tipos inteiros. Usa-se este tipo para referenciar-se a variveis contendo nmeros inteiros. Ex: int valor = 15; Neste caso eu declarei uma varivel chamada valor, do tipo inteiro e com o contedo igual a 15. Simples n? * float: armazena (refere-se) a tipos decimais ou fracionrios. O float simples fornece uma boa preciso de dados. Ex: float valDecimal = 15.6; No exemplo acima, eu declarei uma varivel do tipo decimal, cujo contedo 15.6. Observe que os nmeros fracionrios escrevem-se utilizando o ponto (.) para separar o dgito inteiro dos dgitos decimais no lugar da vrgula (,) conforme utiliza-se na matemtica real. * char: serve para armazenar caracteres alfabticos. Ex: char letraA = 'a'; Note as aspas simples cercando o contedo da varivel. Em C, as aspas simples servem para que se faa referncia a um caractere simples. * void: serve para indicar um retorno nulo, sem retorno, ou qualquer tipo. Deve ser aplicado a funes onde se espera qualquer tipo de retorno ou onde seja previsto a ausncia de retorno. (retorno aquilo que a instruo ou funo nos devolve assim que eh finalizada, no se preocupe com isso agora). * double: fcil de sacar isso, pense no double como um float com muito mais exatido ou preciso. Neste tipo eu posso usar ainda mais casas decimais, podendo ter variveis com at 80 bits de armazenamento para um nico valor. Outro assunto interessante para se observar so os modificadores de tipo atribudos a cada varivel, so eles: unsigned (no sinalizado), signed (sinalizado), long (longo) e short (curto). Veremos com mais detalhes um pouco mais a frente. 3/ peradores bsicos As tarefas em C so efetuadas pelos operadores que podem ser aritmticos, relacionais ou lgicos. Vejamos cada um desses grupos separadamente: 3/1/ peradores aritm4ticos Os operadores aritmticos servem para executarmos tarefas matemticas como soma (+), subtrao (-), multiplicao (*), diviso (/), mdulo ou resto da diviso (%), de incremento (++), de decremento (--), etc. Basicamente no h muito o que explicar a respeito dos operadores aritmticos, exceto os trs ultimos apresentados que merecem um pouco mais de nossa ateno. O primeiro deles o operador conhecido como resto (%), que nada tem a ver com a operao de porcentagem. O operador resto tem como objetivo retornar o resto de uma diviso. Ex: int restoDiv = 15 % 2; O valor armazenado na varivel acima ser 1, pois eh o resto da diviso 15 / 2. Este operador deve ser utilizado em nmeros inteiros. Em C temos dois tipos de operadores aritmticos: os unrios e os binrios. Os unrios so os que agem sobre uma varivel, alterando o seu valor, j os binrios so aqueles que agem sobre mais de uma varivel resultando numa operao que envolva as variveis ou valores em questo. O exemplo dado acima de uma operao binria, pois envolve os valores 15 e 2. Os operadores de incremento e decremento so exemplos dos ditos operadores unrios, pois atuam sobre um nico valor, incrementando (somando 1) ou decrementando (subtraindo 1). Veja abaixo exemplos de incremento e decremento: int b = 10; b++; No exemplo acima a varivel b est sendo incrementada, ou seja, est sendo somado 1 ao valor de b e atualizando o contedo de b para 11, isto equivalente a dizer que b = b + 1;. int b = 10; b--; J neste exemplo b est sendo decrementada, ficando com valor final 9. O visto acima equivalente a b = b - 1;. A posio do operador de incremento ou decremento a uma varivel faz diferena, ou seja, b++ diferente de ++b. Mas como assim? simples, b++ retorna o valor de b e depois incrementa b, j ++b primeiro incrementa e depois retorna o resultado. Mais pra frente vamos ver como isso funciona exemplificando. 3/1/ peradores re)acionais Os operadores relacionais so aqueles que realizam comparaes entre variveis. So eles: (<) menor que, (>) maior que, (<=) menor ou igual a, (>=) maior ou igual a, (==) igual e (!=) diferente. No h muito o que explicar a respeito destes operadores, exceto o operador (==) de igualdade. Este operador completamente diferente do operador de atribuio. O operador (=) serve para inserir um valor a uma varivel enquanto o (==) compara uma varivel a um valor retornando 0 caso a comparao seja falsa e 1 no caso da comparao ser verdadeira. Veremos com mais detalhes estes operadores quando estivermos falando sobre condicionais. 3/3/ peradores )5gicos Estes operadores servem para realizar testes lgicos e so (&&) E, (||) OU e (!) no. Igualmente aos operadores relacionais, os lgicos sero melhor compreendidos quando estivermos falando sobre condicionais. 6/ "rra7s ou matri8es Jah vimos como devemos proceder para declarar variveis, porm, existem mais coisas entre o cu e a terra. Imagine se vc precisar, por algum motivo, declarar 200 variveis inteiras. Caraca, que trabalho hein? Mas espere... no ser trabalho pois vc pode contar com os super, ultra, mega, big, power: matrizeeeeeeeeeesssssss!!!! :D Declarar 200 espaos para 200 inteiros fica muito simples com o uso das matrizes ou arrays. Vejamos como proceder: int valIntGrande[200]; Pronto! Reservei 200 espaos para 200 inteiros. "Mas, como eu posso atribuir valores a varivel valIntGrande?". Simples, eu me refiro a posio que eu quero preencher em minha varivel de 200 espaos. Digamos que eu queira preencher o 3 espao na minha matriz, eu fao assim: valIntGrande[2] = 26; "Mas, pq valIntGrande[2] e no valIntGrande[3], j que vc desejava preencher o 3 espao na matriz?". Mais simples ainda, a contagem dos espaos iniciam em zero (0), ou seja, o primeiro elemento na matriz ser valIntGrande[0], sendo valIntGrande[1] o segundo elemento, valIntGrande[2] o terceiro e assim por diante, logo, valIntGrande vai de 0 a 199 formando os 200 elementos declarados em int valIntGrande[200];. No posso falar sobre arrays sem mencionar os arrays de char e as strings. Arrays de char so somente matrizes do tipo char, j strings so constantes que ficam entre aspas. O C no reconhece nenhum tipo de texto, ou seja, frases e/ou palavras prontas (que no sejam comandos da linguagem ou nomes de funes e variveis). A palavra Genese no existe, porm ela eh vista como um monte de caracteres alinhados, o que chamamos de corda de caracteres, ou string. Para armazenar valores textuais em variveis eu procedo assim: char valCharGrande[7] = "Genese"; "Mas pq 7 elementos quando a palavra Genese tem apenas 6?". Eh que toda string termina em um caracter extra que indica seu final. Ele conhecido como finalizador de string e o seu valor eh '\0' ou 0. A varivel acima fica assim na memria: valCharGrande .............. |G|e|n|e|s|e|\0|
0 1 2 3 4 5 6 Observando e entendendo o esquema acima, eu posso concluir que, aps armazenada, a string pode ser editada, fazendo referncia ao seu termo na matriz. Inclusive, este termo eh conhecido como ndice. Ex: digamos que eu queira trocar o 'n' por 'N' na varivel acima... valCharGrande[2] = 'N'; Aps a troca, o esquema fica assim: valCharGrande .............. |G|e|N|e|s|e|\0|
0 1 2 3 4 5 6 Os mais ligados puderam notar que quando se faz referncia a uma string usa-se aspas duplas ("") e quando se faz referncia a um caracter isolado usam-se aspas simples (''). Isso eh uma regra em C; ao referenciar-se a strings, usamos aspas duplas e ao referenciar-se a caracteres, usamos aspas simples. Preste ateno nisto que eh algo muito importante. 9/ 0ntrodu,o as fun:es Funes so trechos de cdigo responsvel pela realizao de determinada tarefa. Assim como as variveis, as funes possuem nomes e normalmente tipos tbm. Vejamos a sintaxe geral de uma funo: tipo nome_da_funcao(argumentos ou parametros) { Aqui vem os comandos; } Quanto ao nome das funes podemos aplicar as mesmas regras usadas para nomes de variveis, ou seja, nunca declarar funes com caracteres especiais (acentos e/ou smbolos) e nunca comear os nomes com nmeros. Como regra geral de nomenclatura podemos concluir que podemos iniciar nomes por caracteres alfabticos (letras), o nico sinal permitido eh o underline (_), e nunca acentuar os nomes ou usar caracteres especiais. Argumentos so valores que se queira passar para uma funo. Os argumentos ou parmetros ficam sempre no espao entre parnteses e estes so opcionais (dependendo do contexto do programa). Temos tbm o bloco de cdigos que nada mais do que a juno de um grupo de comandos que sero processados seqencialmente, ou seja, um por vez. O bloco de cdigos consiste em um par de chaves ({}) e os comandos agrupados entre as chaves. Isto caracteriza um bloco de cdigos. Um bloco de cdigos sempre se refere a funo que est acima dele. Vejamos abaixo um exemplo de funo: int main() { printf("Seja bem vindo ao C!"); return(0); } Temos acima uma funo completa, inclusive esta funo (main = principal) eh a mais importante de um programa em C. No fui eu quem a criou, ela eh a primeira funo a ser executada em qualquer programa. Nesta funo tbm temos um bloco de cdigo delimitado pelo par de chaves. Sejamos razoveis, nada to complicado assim de se entender, n? No se preocupe com os comandos dentro do bloco de cdigos, vc ficar fera neles em pouco tempo. Mais um detalhe, observe o int antes do nome da funo e o return(0) no final do bloco. Este return() eh o que retorna o resultado final da funo quando ela terminar (detalhe: terminar a funo main significa finalizar o programa). Ainda no exemplo acima, o valor retornado no final do programa eh o nmero inteiro 0, o que significa em sistemas operacionais modernos que o programa foi finalizado corretamente e nada de inesperado ocorreu. Voc tbm pode escrever suas prprias funes e cham-las dentro da funo main. Vejamos abaixo um exemplo: int olah() { printf("Ola! Eu estou vivo!"); return(0); } int main() { olah(); return(0); } A funo olah() foi escrita pela minha pessoa. Esta funo tem um objetivo, no caso acima faz uma chamada a mais uma funo: printf(). Esta funo printf() tem por objetivo escrever algo na tela, no caso a string Ola! Eu estou vivo! Mas lembre-se, o processamento das instrues em C se d de forma sequencial, ento em main() quando eu fao a chamada a funo olah() e esta termina, main() continua processando os comandos seguintes. 6/ &omentrios Os comentrios servem para facilitar o trabalho de manuteno do programa. Digamos que eu tenha criado um programa a mais de 3 anos, e hoje precise dar manuteno nele. Com certeza minha manuteno ser muito mais eficiente se eu usar comentrios nas muitas partes do programa, descrevendo o funcionamento daquela rea. uma boa prtica de programao utilizar comentrios em todos os programas feitos, pois isso pode ajudar muito num futuro. Existem dois tipos de comentrios: os de uma linha e os de mais de uma linha. Para criar um comentrio de uma linha eu utilizo a notao: // Este um comentrio de uma linha e o mesmo somente eh vlido nesta linha. // Este j outro comentrio, mas note que eu tive q colocar o // de novo. J um comentrio de mais de uma linha se processa assim: /* Este um comentrio de mais de uma linha. Nele eu posso sair digitando o meu texto at o momento que eu naum mais queira digitar. Como se pode notar, ele iniciado pela barra- asterisco e ser finalizado mais a frente pelo asterisco-barra. */ Note que o comentrio acima possui mais de uma linha e normalmente os programadores utilizam comentrios no formato /* */, mas nada impede vc de utilizar o comentrio no formato // por linha. ;/ Fun:es de entrada e sa(da Isso no difcil de assimilar naum, saca s... As funes de entrada so aquelas em que o computador fica aguardando que o usurio fornea alguma informao, ou seja, as que os perifricos de entrada (teclado, mouse, caneta-tica, joystick, etc) envie alguma informao ao computador. As funes de sada so o oposto. So aquelas funes em que o computador envia informaes ao usurio atravs dos dispositivos de sada (monitor, impressora, plotter, etc). Existem duas funes muito bsicas de entrada e sada: puts() e o gets(). puts() uma funo de sada que responsvel pela impresso de algo na tela do monitor. Veja abaixo um exemplo: int main() { puts("Eita que hoje eu amanheci azeitado!!!"); return(0); } O que a funo puts() (que significa put string = colocar string) vai fazer imprimir a string entre parnteses na tela (sem as aspas). J a funo gets() (que significa get string = pegar string) simplesmente aguarda que o usurio digite uma string para armazen-la dentro de um array de char. Veja o exemplo: int main() { char valorChar[20]; // Declarei a varivel para at 20 caracteres gets(valorChar); // Aqui a varivel ser preenchida com o que o usurio puts(valorChar); // digitar e em seguida o puts ir imprimir o contedo da return(0); // varivel na tela. } Note que o puts() do programa acima no faz referncia direta uma string e sim a uma varivel matriz de char com contedo preenchido pelo usurio do programa. Isto possvel pois eu posso referenciar o nome de uma varivel para visualizar o contedo da mesma ou seja, quando eu coloco a varivel como argumento da funo puts() eu estou pedindo pra o C se referenciar ao contedo daquela varivel. Sendo assim o programa acima espera que o usurio digite uma string e imprime a mesma na tela em seguida. Por motivos de segurana, no aconselhvel a utilizao da funo gets(), pois esta funo no controla o tamanho do que est sendo digitado, logo, considerando o exemplo acima, no gets(), se o usurio digitar algo maior que 20 caracteres, o sistema simplesmente ir continuar escrevendo como se o array ainda no tivesse acabado. Isso perigoso, pois trata-se de uma tcnica de invaso muito conhecida chamada buffer overun e no eh aconselhvel o seu uso em programas "seguros". Existem outros tipos de funes que sero vistos no segundo nvel de nosso curso sobre C. Falamos em puts() e gets(), sabemos pra que serve cada uma dessas funes. Mas sabemos tbm q o uso das mesmas eh limitado ao tipo string. Falaremos agora sobre outras funes que so mais abrangentes: printf() e scanf(). O printf(): Trata-se de uma funo de sada que me possibilita o uso de variveis de qualquer tipo reconhecido pelo C. O termo printf significa imprimir formatado. Mas o que ser formatado? Esta outra questo interessante no printf(). Eu posso dar algumas formataes a minha string utilizando os caracteres de formatao ou de escape. Abaixo o bsicos sobre caracteres especiais: Caracteres de formatao: * %c = usado para referncia a um caractere * %d = faz referncia a nmeros inteiros * %f = faz referncia a nmeros decimais ou ponto-flutuante * %s = faz referncia a strings Caracteres de escape ou constantes de barra invertida * \n = quebra de linha (pula para linha seguinte) * \t = tabulao (mesma funo da tecla tab) * \0 = caracteres nulo ou finalizador de string Vejamos alguns exemplos do uso de caracteres especiais com printf(): < E+emp)o 1- int valor1 = 10, valor2 = 30, resultado; resultado = valor1 + valor2; printf("A soma de %d e %d : \n %d",valor1,valor2,resultado); O resultado desse comando a impresso da seguinte frase e no seguinte formato: A soma de 10 e 30 : 40 Note que aps a string temos os nomes das variveis separados por vrgulas. Isso faz com que o printf() entenda que existem trs partes no interior da string que precisam ser formatadas, justamente os trs '%d'. Estes '%d' sero substitudos pelos contedos armazenados em cada varivel de forma seqencial, ou seja, o primeiro %d (da esquerda para a direita) ser substituindo pela primeira varivel listada (no caso valor1); o segundo %d ser substituindo pela segunda varivel listada (no caso valor2) e o terceiro %d ser substituindo pela terceira varivel listada (no caso resultado). Em contra-tempo o caractere de escape '\n' ir pular para a linha seguinte antes de continuar imprimindo a string, ou seja, no caso acima colocando o valor do terceiro %d na linha seguinte conforme apresentado no resultado do exemplo. < E+emp)o 1- int nome[10] = "Genese"; printf("A 3 letra do nome %s %c!", nome, nome[2]); O resultado desse comando a impresso da seguinte frase e no seguinte formato: A 3 letra do nome Genese n! Conforme visto nos conceitos, o primeiro caractere especial (%s = string) ser substituindo pelo valor contido na primeira varivel listada (no caso nome). J o segundo caractere especial listado (%c = caractere) refere-se a uma nica letra e ser substituindo pela sua referencia aps a string (no caso nome[2]). Este o jeito mais bsico do uso da funo printf(), e esta substitui com facilidade a funo puts(). Vejamos ento quem substitui o gets(): Senhoras e senhores... o FDL06-1 orgulhosamente apresenta: scanf()!!! :) Como o gets() o scanf() serve para capturar valores digitados pelo usurio, porm, com muito mais funcionalidade a arte da captura de valores e armazenagem em variveis. Utilizando os caracteres especiais citados no printf() podemos realizar captura dos mais diversos tipos de dados. Vejamos abaixo alguns exemplos: int main() { // Este programa realiza uma soma int val1, val2, result; printf("Qual o 1 termo? "); scanf("%d", &val1); printf("Qual o 2 termo? "); scanf("%d", &val2); result = val1 + val2; printf("O valor da soma entre %d e %d %d\n!", val1, val2, result); return(0); } Note nas funes scanf() acima. No difcil de entender, uma funo que contm dois argumentos pois o que est entre parnteses est separado por vrgula com pondo dois argumentos. No primeiro argumento eu uso uma string de controle, tbm conhecida como expresso de entrada. A string de controle serve para identificar o tipo de dados que o scanf() estar coletando, no exemplo acima trata-se de um inteiro. O segundo argumento (aps a vrgula) o nome da varivel que ir conter o valor digitado antecedido do sinal (&) ou e comercial. No tenho como explicar o uso desse & agora, porm, mais tarde (no nvel 2) tudo ficar muito claro. Por hora saiba apenas que o uso do & obrigatrio no scanf(). Veja abaixo um exemplo de scanf() utilizando char e string: int main() { char nome[10], letra; printf("Digite o seu primeiro nome e tecle enter: "); scanf("%s", &nome); printf("Digite uma letra e tecle enter: "); scanf("%c", &letra); printf("O seu nome %s e a letra digitada foi %c!\n", nome, letra); return(0); } Neste exemplo eu demonstro como proceder para armazenar uma string e um char em variveis. Vc tbm poderia acessar um ndice da string em nome utilizando da notao j conhecida, por exemplo, digamos que vc queira exibir somente a primeira letra da string acima: printf("A primeira letra da varivel nome %c", nome[0]); Pronto, isto conclui mais um captulo do nosso curso de C bsico. Vamos ao prximo tpico... =/ &ondiciona) Esta parte considerada primordial em qualquer linguagem de programao, pois permite auxiliar o programador nas tomadas de deciso, proporcionando uma forma de analisar dados e tomar decises baseadas nos resultados. A forma mais conhecida de condicional o if(). Veja a sintaxe bsica: if(expresso a ser avaliada) { bloco para o caso da expresso ser verdadeira; }else{ bloco para o caso da expresso ser falsa; } sempre bom traduzir os comandos. If = Se e Else = Seno. Veja um exemplo funcional de if: int main() { int senha = 1234, minhaSenha; printf("Digite a sua senha: "); scanf("%d", &minhaSenha); if(minhaSenha == senha) { printf("A senha est correta!!!\n"); }else{ printf("A senha est errada!!!\n"); } return(0); } No exemplo acima temos a declarao de duas variveis inteiras, sendo que uma delas (senha) inicialmente preenchida com o valor 1234 e a outra varivel fica sem valor, pois esta ser preenchida com um dado informado pelo usurio do programa. O if() em questo analisa a expresso minhaSenha == senha retornando o valor 1 para verdadeiro e 0 para falso. No caso do retorno ser verdadeiro o programa ir executar o bloco do if(), ou seja, o que est dentro do primeiro par de chaves aps o if(). Caso a expresso seja falsa, os comandos executados sero os que esto dentro do bloco de cdigo do else, ou seja, os comandos entre as chaves aps o else. Conforme ficou dito quando falamos a respeito dos operadores lgicos, estes ficam melhor explicados agora que estamos falando em condicional. Vejamos os principais operadores lgicos: * && - Chama-se E, e permite analisar duas ou mais expresses de uma vez e somente retorna verdadeiro caso as duas expresses apresentadas sejam verdadeiras. Complicado? Que nada, v s: int a=10, b=20; if(a==10 && b==20) { printf("Tudo certo, as expresses so verdadeiras!\n"); }else{ printf("Nem todas ou nenhuma expresso verdadeira!\n"); } No caso acima o programa iria imprimir na tela a seguinte frase: Tudo certo, as expresses so verdadeiras! Mas digamos que as expresses fossem as seguintes: int a=10, b=20; if(a==30 && b==20) { printf("Tudo certo, as expresses so verdadeiras!\n"); }else{ printf("Nem todas ou nenhuma expresso verdadeira!\n"); } O resultado do programa seria: Nem todas ou nenhuma expresso verdadeira! ... pois somente uma das expresses verdadeira (b==20). Vc pode utilizar quantas expresses quiser no programa, isso somente depende da sua criatividade. * || - Chama-se OU, e permite avaliar duas ou mais expresses, porm executa o bloco verdadeiro no caso de uma das expresses ser verdadeira e somente executa o bloco falso no caso de todas as expresses apresentadas ao if() serem falsas. Veja um exemplo: int main() { int a=15, b=20, c=35; if(a=40 || b==40 || c==40) { printf("Ok, uma das expresses eh verdadeira!\n"); }else{ printf("Nenhuma das expresses acima eh verdadeira!\n"); } return(0); } No caso acima o programa teria o seguinte resultado: Nenhuma das expresses acima eh verdadeira! ... pois nenhuma das trs expresses apresentadas verdadeira, mas se uma expresso sequer fosse verdadeira, o bloco verdadeiro eh que seria executado. Tente escrever alguns programas utilizando condicionais e veja como vc estah se saindo. >/ Loops ou )aos Digamos que vc precise escrever um programa que imprima 10 nmeros sendo que um abaixo do outro na tela. A forma conhecida seria utilizar 10 funes printf() ou puts() ou at mesmo um printf() contendo os nmeros e separados por '\n'. Seria algo mais ou menos assim: Ex1: int main() { printf("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"); return(0); } Relativamente fcil, mas a coisa ficaria um pouco mais complicada se eu pedisse pra vc imprimir na tela de 1 at 10000. Jah pensou em escrever um printf() desse tamanho? Bronca hein? Mas no se preocupe, a linguagem C tem a honra de apresentar: os laos!!! Tbm conhecidos como loops, os laos tem o objetivo de realizar varias vezes um determinado bloco de cdigos os instruo. Vejamos como isso ocorre escrevendo o programa acima, porm usando lao: Ex2: int main() { int i; for(i=1; i<11; i++) { printf("%d\n", i); } return(0); } "Bom, o exemplo 1 tem somente duas linhas e o exemplo 2 tem 6 linhas, sendo assim eu prefiro do primeiro jeito!". S que devemos considerar a possibilidade de ter que imprimir milhares e at mesmo milhes de nmeros na tela. Fica complicado digitar tudo isso na mo e vai nos custar um monte de bytes... Vamos analisar o lao chamado for() que est presente no exemplo 2. A sintaxe do for() a seguinte: for(de; at/enquanto; como) { bloco a ser repetido; } Note que aps os parnteses do for temos trs sub-comandos divididos entre si por sinais de ponto-e-vrgula (;). O primeiro destes comandos indica a partir de quanto a sua contagem ir iniciar. O segundo indica quando ela ir terminar. E o terceiro indica de que forma a contagem ir proceder. No caso do exemplo 2 a contagem feita em cima de uma varivel inteira chamada 'i' que eh declarada no incio do programa. O lao for comea a contagem atribuindo o valor 1 a 'i', em seguida ele faz uma comparao e verifica se 'i' menor que 11 (i<11). No caso desta comparao retornar 1, ou seja, ser verdadeira, significa dizer que o lao ainda no terminou e somente ser finalizado quando a condio exposta for quebrada. Retornando uma opo verdadeira no segundo comando o lao prossegue e o terceiro comando entra em ao e a varivel i incrementada (i++). Aps essas verificaes terem sido feitas, o lao prossegue executando os comandos que esto dentro do bloco de cdigos do lao. No caso acima, escrevendo o contedo da varivel 'i' e quebrando uma linha, dando o resultado de contagem que estvamos buscando. As formas que o lao for() podem ser executadas suprem qualquer necessidade de repetio, porm, ainda assim existem outras formas de se fazer laos e uma das mais utilizadas o lao while() que funciona baseado na seguinte sintaxe: while(expresso) { bloco de repetio; } A palavra while significa em portugus enquanto. Ou seja, o while repete o bloco de repetio enquanto a expresso entre parnteses for verdadeira. Na opinio de algumas pessoas o while() mais fcil de usar e mais simples que o for. Pessoalmente eu gosto mais do for(). Vejamos abaixo um exemplo do uso do while(): int main() { int i=0; while(i<=200) { printf("%d\n", i); i++; } return(0); } No exemplo apresentado acima, o lao while ir avaliar a expresso de controle (i<=200), ou seja, o while vai ver se i menor ou igual a 200. Se a expresso for verdadeira, ento o bloco de cdigos do while ir ser executado, caso contrrio o fluxo do programa pula para depois do bloco do while(). uma modalidade boa de lao, aconselho o aprofundamento no mesmo, tente escrever alguns laos usando este lao e compil-lo em seu PC. 10/ #ais variveis/// escopo Chegamos numa parte bem interessante no estudo da linguagem C. A palavra escopo representa rea de atuao, ou seja, no caso de variveis, escopo onde elas existem e podem ser acessadas ou alteradas. Existem 3 trs possibilidades de atuao das variveis quanto ao escopo: locais, globais e de argumento. Vejamos: * Variveis locais: so aquelas que so declaradas dentro do bloco de cdigos de uma funo e somente possuem funcionalidade (existem) enquanto a funo em questo est sendo executada. Quando declaramos uma varivel dentro de uma funo, esta automaticamente eh excluda e a memria utilizada por ela eh liberada assim que a funo termina. Veja um exemplo de varivel local: #include<stdio.h> int main() { int val1, val2, result; return(0); } As variveis acima esto declaradas dentro de main(), portanto as mesmas no possuem funcionalidade em outras funes diferentes de main(). * Variveis globais: so aquelas declaradas de forma que no estejam dentro de nenhuma funo, sendo visveis a qualquer funo deste programa. Veja um exemplo de varivel global: #include<stdio.h> int val1, val2, result; int preencheValor() { val1 = 10; val2 = 30; result = val1 + val2; return(0); } int main() { preencheValor(); printf("A soma de %d e %d %d\n", val1, val2, result); return(0); } Observe que no exemplo acima a declarao das variveis ocorre abaixo do #include, ou seja, fora de qualquer funo e, portanto, visvel a todas elas. Neste tipo de varivel podemos acessar ou alterar o valor delas livremente, pois elas pertencem a qualquer parte do programa, por isso o nome global. * Variveis de argumento: so aquelas declaradas nos parnteses das funes e servem para passar valores de uma funo para a outra. Vejamos um exemplo: int soma(int a, int b) { return(a + b); } int main() { int val1 = 10, val2 = 15; printf("A soma de %d e %d %d\n", val1, val2, soma(val1, val2)); return(0); } Observe que no exemplo acima as variveis da funo main() so variveis locais, ou seja, somente servem para main(). O ultimo argumento do printf() em main : soma(val1, val2). Isto est acontecendo pois neste momento eu estou chamando a funo soma() e estou passando dois valores a ela nos parnteses (val1, val2) e esta funo est me retornando a soma dos valores conforme comando return dentro do bloco de cdigo da funo soma(). Observe tambm que o local onde a funo soma est sendo chamada pelo printf() equivale a um %d dentro da string, ou seja, este ser substituindo pelo retorno da funo soma. Mas o foco aqui observar como se faz a passagem de valores de uma funo para a outra. Quando eu passo valores via varivel de argumento, na verdade estamos passando para a funo chamada, cpias dos valores contidos nas variveis e no o contedo das mesmas, ou seja, no final das contas eu tenho como passar valores de uma funo para a outra, porm, no estou alterando em uma funo o valor contido na outra. possvel fazer isto, porm, somente quando estivermos estudando ponteiros isso ser visto. Temos outro ponto importante neste tpico. Quando eu declaro uma funo que ir receber, por exemplo, trs valores inteiros, eu devo proceder assim: int multiplicacao(int a, int b, int c)... Note que as trs variveis esto e precisam estar sendo declaradas uma a uma no podendo ser feito da seguinte forma: int multiplicacao(int a, b, c)... Isto ocorre pois em funes os argumentos independem um do outro, ou seja, neste caso, temos trs argumentos independentes, sendo assim necessrio que sejam todos eles minuciosamente declarados. 11/ Diretivas de pr4-processamento- ?inc)ude e ?define Conforme o prprio nome diz, as diretivas de pr-processamento ocorrem no momento da compilao do programa. So comandos especiais que indicam ao compilador dados importantes e fundamentais ao contexto do meu programa. As diretivas de pr-processamento so iniciadas pelo smbolo # (sharp). Vejams como funcionam duas importantes diretivas: * #include<nome_da_biblioteca.h> Este comando inclui o suporte s funes que existem dentro do arquivo especificado, note que o nome do arquivo est entre sinais de maior e menor que (<>). Esta uma forma do C saber que o arquivo mencionado um arquivo que est dentro do diretrio padro do sistema para arquivos cabealho, em UNIXes normalmente algo como /usr/include. Os arquivos do tipo *.h (bibliotecas) so os possuidores das funes que tanto utilizamos, por exemplo, se no for colocada a diretiva #include<stdio.h>, nenhuma funo de entrada ou sada padro habilitada, ou seja, o C no reconhecer nem mesmo comandos bsicos como o printf() ou scanf(). Na verdade existem poucos comandos no C, toda a complexidade maior da linguagem se d devido ao enorme nmero de funes criadas para esse ou aquele fim. Ser possvel ao trmino do curso a criao de funes para as mais diversas atividades. * #define: esta diretiva possibilita o uso de um conceito bem til em C: o uso de constantes literais. Uma constante literal s um "apelido" dado pelo programador a um valor no programa. Exemplo: #include<stdio.h> #define senha 1234 int main() { int mySenha; printf("Digite a sua senha: "); scanf("%d", &mySenha); if(mySenha == senha) { printf("Senha correta!\n"); }else{ printf("Senha errada, por favor, tente novamente...\n"); main(); } return(0); } Observe a declarao de uma diretiva #define na segunda linha do programa. Esta diretiva est dando o apelido senha ao valor 1234, ou seja, eu no preciso utilizar o nmero 1234, basta usar o nome que eu preferi dar ao valor 1234 para me referir a ele. Logo, o if() em main est verificando se o valor digitada pelo usurio igual a 1234. "Mas no que isso til? Eu prefiro usar o valor 1234". De fato em um programa pequeno como este apresentado no exemplo fica at mais complicado utilizar o #define. Mas imagine que vc esteja escrevendo um programa enorme de 15 000 linhas e com centenas de funes e em vrias das funes vc deva fazer referncia a um endereo de memria complicado de decorar como 0xcda40b64 no seria melhor utilizar um nome mais amigvel dado por vc??? Sem contar que se por acaso algo desse errado e o endereo de memria que vc quisesse usar fosse outro como 0xcda70b26, bastaria editar uma linha (a da diretiva #define) e recompilar para que todo o programa esteja atualizado. A sintaxe para o define : #define apelido valor Simples, prtico e limpo... 11/ @m pouco sobre fun,o mainAB Em qualquer programa escrito em C, a funo main() a primeira a ser executada e por isso eh conhecida como funo principal. Se eu tenho centenas de funes em meu programa, saiba que nenhuma delas ser automaticamente executada, exceto main(). Por isso algumas recomendaes sobre esta funo: * Mantenha- limpa, ou seja, sem poluio de cdigo; * Divida as tarefas de seus programas de forma que o problema inicial seja subdividido em partes menores e cada uma dessas partes seja resolvida em uma funo diferente, pois quando temos o hbito de nos organizar, temos tendncia a errar menos... * Evite declarar variveis e usar outros processos que consumam memria dentro de main(), faa isso dentro de funes que estejam resolvendo o seu problema e use main() somente como ponto de partida do seu programa, no que isso influa em algo, mas novamente mencionando, se organizar uma das grandes armas de bons programadores. * main() inicia o programa, mas tbm responsvel pelo encerramento do mesmo, ou seja, se a funo main() acabar, todo o programa tbm ser encerrado. 13/ &onc)us,o com muito prazer que eu anuncio o final do primeiro txt do FDL. Aqui finalizamos o primeiro mdulo dos nossos estudos. Gostaria de agradecer aos alunos e membros do FDL06-1 (mandrakeFDL, conectivaFDL, debianFDL, fedoraFDL, kuruminFDL, coyoteFDL). Espero ter ajudado em nossa primeira jornada de aprendizado. Em caso de dvidas, sugestes, reclamaes, elogios, podem me contactar atravs do e-mail genese@ministeriolapaz.com.br. Um forte abrao a todos e at a prxima! Genese Lessa - slackwareFDL