Você está na página 1de 16

FDL06-1

Primeiro grupo de estudos sobre informtica


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

Você também pode gostar