linguagem c completa e descomp
TRANSCRIPT
-
5/20/2018 Linguagem c Completa e Descomp
1/367
-
5/20/2018 Linguagem c Completa e Descomp
2/367
Preencha a ficha de cadastrono final deste livro
e receba gratuitamente informaes
sobre os lanamentos e as promoes da Elsevier.
Consulte tambm nosso catlogo
completo, ltimos lanamentos
e servios exclusivos no site
www.elsevier.com.br
-
5/20/2018 Linguagem c Completa e Descomp
3/367
-
5/20/2018 Linguagem c Completa e Descomp
4/367
2013, Elsevier Editora Ltda.
Todos os direitos reservados e protegidos pela Lei no9.610, de 19/02/1998.
Nenhuma parte deste livro, sem autorizao prvia por escrito da editora, poder ser reproduzida ou
transmitida sejam quais forem os meios empregados: eletrnicos, mecnicos, fotogrficos, gravao
ou quaisquer outros.
Copidesque:Ivone Teixeira
Reviso:Clara Dioment e Vanessa Raposo
Editorao Eletrnica:Estdio Castellani
Elsevier Editora Ltda.
Conhecimento sem Fronteiras
Rua Sete de Setembro, 111 16oandar
20050-006 Centro Rio de Janeiro RJ Brasil
Rua Quintana, 753 8oandar
04569-011 Brooklin So Paulo SP Brasil
Servio de Atendimento ao Cliente0800-0265340
ISBN 978-85-352-6855-3
Nota:Muito zelo e tcnica foram empregados na edio desta obra. No entanto, podem ocorrer erros de digitao,
impresso ou dvida conceitual. Em qualquer das hipteses, solicitamos a comunicao ao nosso Servio de
Atendimento ao Cliente, para que possamos esclarecer ou encaminhar a questo.
Nem a editora nem o autor assumem qualquer responsabilidade por eventuais danos ou perdas a pessoas
ou bens, originados do uso desta publicao.
CIP-Brasil. Catalogao na fonte
Sindicato Nacional dos Editores de Livros, RJ
B122L Backes, Andr
Linguagem C: completa e descomplicada / Andr Backes.
Rio de Janeiro: Elsevier, 2013.
400 p. : 24 cm
ISBN 978-85-352-6855-3
1. C (Linguagem de programao de computador).
2. Programao (Computadores). I. Ttulo.
12-8461. CDD: 005.1
CDU: 004.41
-
5/20/2018 Linguagem c Completa e Descomp
5/367
minha esposa Bianca, que sempre me apoioue incentivou a cada novo passo dado.
-
5/20/2018 Linguagem c Completa e Descomp
6/367
Agradecimentos
Aos amigos que fiz no convvio dirio da Faculdade de Computao da Univer-
sidade de Federal de Uberlndia (FACOM-UFU).
Aos meus pais, que sempre me apoiaram em todas as etapas da minha vida.
Ao Prof. Dr. Odemir Martinez Bruno, pela confiana depositada em mim, orien-
tao e amizade, sem as quais no teria me tornado um professor.
Aos meus alunos, que atuaram como guias. Foi pensando em ajud-los que me
arrisquei a produzir esta obra.
-
5/20/2018 Linguagem c Completa e Descomp
7/367
C A P T U L O 1
Introduo
Alinguagem C uma das mais bem sucedidas linguagens de alto nvel j criadase considerada uma das linguagens de programao mais utilizadas de todos ostempos. Porm, muitas pessoas a consideram uma linguagem de difcil apren-
dizado, seja pela dificuldade de compreender certos conceitos (como os ponteiros), sejapela falta de clareza com que a estrutura da linguagem descrita.
Nesse sentido, pretende-se uma nova abordagem que descomplique os conceitosda linguagem por meio de lembretes e avisos que ressaltem seus pontos-chave, alm
de exemplos simples e claros de como utiliz-la. Para isso, almeja-se utilizar o softwareCode::Blocks, uma IDE de cdigo aberto e multiplataforma que suporta mltiploscompiladores, entre eles a linguagem C.
Este livro foi desenvolvido como um curso completo da linguagem C. Sua elabo-rao foi focada na separao do que conhecimento bsico e avanado, ou seja, entreaquilo que usamos no dia a dia e o que usamos apenas em aplicaes muito especficas.Foi priorizada a simplicidade na abordagem dos tpicos. Desse modo, espera-se que olivro possa ser facilmente utilizado, tanto por profissionais que trabalhem com progra-mao quanto por profissionais de reas no computacionais (bilogos, engenheiros,
entre outros) e que precisem, vez ou outra, desenvolver um programa para automatizaruma tarefa.
Quanto a sua estrutura, adotamos a seguinte forma: no Captulo 1, apresentamosum rpido histrico sobre a linguagem, as etapas de compilao do programa, o usode comentrios, suas principais bibliotecas e funes, como criar um novo projeto naIDE Code::Blocks e como escrever o primeiro programa em C.
O Captulo 2 mostra definies e conceitos sobre variveis e seus tipos possveis,palavras-chave e escopo de variveis. Em seguida, mostrado como podemos fazer aleitura do teclado de uma varivel e a sua escrita no dispositivo de vdeo. J no Captu-
lo 3, descrevemos as operaes que podemos realizar com uma varivel.
-
5/20/2018 Linguagem c Completa e Descomp
8/367
2 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
Nos Captulos 4 e 5 so descritos os conceitos de comandos de controle condicio-nal e de repetio (os laos). Esses captulos completam a apresentao da estruturabsica da linguagem.
O Captulo 6 trata do uso dos arrays, isto , vetores e matrizes. So apresentadosalguns exemplos de operaes bsicas realizadas com essas estruturas da linguagem. Jno Captulo 7 tratamos da manipulao de strings, que nada mais so do que arraysde caracteres.
Tratamos da criao de novos tipos de dados pelo programador no Captulo 8.Nesse captulo so apresentados os tipos estrutura, unio e enumerao, alm do usoda palavra-chave typedef.
Declarao e uso de funes so o tema do Captulo 9. Nesse captulo tratamostambm dos tipos de passagem de parmetros para as funes e da recursividade. NoCaptulo 10 tratamos detalhadamente a declarao, o uso de ponteiros e as operaespossveis com ponteiros, enquanto o Captulo 11 aborda a alocao dinmica de me-mria.
Na sequncia, o Captulo 12 aborda os conceitos de leitura e escrita em arquivos,nos modos texto e binrio, alm de exemplificar as funes de acesso a arquivos emalto nvel.
O Captulo 13 reservado abordagem de assuntos considerados avanados na lin-guagem: classes de armazenamento, diretivas do pr-processador, array de ponteiros,ponteiros para funes, argumentos da linha de comandos e recursos adicionais dasfunes printf()e scanf(), entre outros tpicos.
Por fim, o Captulo 14 apresenta o padro 99 da linguagem C, uma reviso do pa-dro ANSI de 1989 da linguagem C. No ltimo captulo, o Captulo 15, explicamoscomo funcionam os sistemas numricos decimal, hexadecimal, octal e binrio e suasconverses.
1.1 A LINGUAGEM C
A linguagem C uma das mais bem-sucedidas linguagens de alto nvel j criadas econsiderada uma das linguagens de programao mais utilizadas de todos os tempos.Define-se como linguagem de alto nvel aquela que possui um nvel de abstrao re-lativamente elevado, que est mais prximo da linguagem humana do que do cdigode mquina. Ela foi criada em 1972, nos laboratrios Bell, por Dennis Ritchie, sendorevisada e padronizada pelo ANSI (American National Standards Institute) em 1989.
Trata-se de uma linguagem estruturalmente simples e de grande portabilidade.Poucas so as arquiteturas de computadores para as quais no exista um compiladorC. Alm disso, o compilador da linguagem gera cdigos mais enxutos e velozes do quemuitas outras linguagens.
A linguagem C uma linguagem procedural, ou seja, ela permite que um problemacomplexo seja facilmente decomposto em mdulos, sendo cada mdulo um problemamais simples. Alm disso, ela fornece acesso de baixo nvel memria, o que permite
-
5/20/2018 Linguagem c Completa e Descomp
9/367
Introduo 3
o acesso e a programao direta do microprocessador. Ela tambm permite a implan-tao de programas utilizando instrues em Assembly, o que possibilita programarproblemas em que a dependncia do tempo critica.
Por fim, a linguagem C foi criada para incentivar a programao multiplataforma,ou seja, programas escritos em C podem ser compilados para uma grande variedadede plataformas e sistemas operacionais com apenas pequenas alteraes no seu cdigo-fonte.
1.1.1 Influncia da linguagem C
A linguagem C tem influenciado, direta ou indiretamente, muitas linguagens de-senvolvidas posteriormente, como C++, Java, C# e PHP. Na Figura 1.1 possvel veruma breve histria da evoluo da linguagem C e de sua influncia no desenvolvimen-to de outras linguagens de programao.
Perl
Perl 5.0
PHP
Python ISO C (C99) C++
C++11
JAVA ActionScript
Objective-C2.1
C#
C1X
C
awk C (K & R)
nawk ANSIC C with
Classes Objective-C
OakC++
ANSI/ISO
PHP/FI JAVA1
JAVA2
F IG U RA 1 . 1
Provavelmente a influncia mais marcante da linguagem foi a sua sinttica: todas asmencionadas combinam a sintaxe de declarao e a sintaxe da expresso da linguagemC com sistemas de tipo, modelos de dados etc. A Figura 1.2 mostra como um coman-
do de impresso de nmeros variando de 1 a 10 pode ser implementado em diferenteslinguagens.
-
5/20/2018 Linguagem c Completa e Descomp
10/367
4 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
F IG U RA 1 . 2
1.2 UTILIZANDO O CODE::BLOCKS PARA PROGRAMAR EM C
Existem diversos ambientes de desenvolvimento integrado ou IDEs (Integrated De-
velopment Environment) que podem ser utilizados para a programao em linguagemC. Um deles o Code::Blocks, uma IDE de cdigo aberto e multiplataforma que supor-ta mtiplos compiladores. O Code::Blockspode ser baixado diretamente de seu site
ou pelo link
Este ltimo inclui tanto a IDE do Code::Blockscomo o compilador GCC e odebugger GDB da MinGW.
1.2.1 Criando um novo projeto no Code::Blocks
Para criar um novo projeto de um programa no software Code::Blocks, basta seguirestes passos:
1) Primeiramente, inicie o software Code::Blocks(que j deve estar instalado no seucomputador). Aparecer a tela da Figura 1.3.
F IG U RA 1 . 3
-
5/20/2018 Linguagem c Completa e Descomp
11/367
Introduo 5
2) Em seguida clique em File, escolha Newe depois Project... (Figura 1.4).
F IG U RA 1 . 4
3) Uma lista de modelos (templates) de projetos vai aparecer. EscolhaConsole apli-cation (Figura 1.5).
F IG U RA 1 . 5
4) Caso esteja criando um projeto pela primeira vez, a tela a seguir vai aparecer. Se marcar-mos a opo Skip this page next time, essa tela de boas-vindas no ser mais exibidada prxima vez que criarmos um projeto. Em seguinda, clique em Next (Figura 1.6).
F IG U RA 1 . 6
-
5/20/2018 Linguagem c Completa e Descomp
12/367
6 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
5) Escolha a opo Ce clique em Next(Figura 1.7).
F IG U RA 1 . 7
6) No campo Project title, coloque um nome para o seu projeto. No campo Fol-der to create project in possvel selecionar onde o projeto ser salvo no compu-tador. Clique em Nextpara continuar (Figura 1.8).
F IG U RA 1 . 8
7) Na tela da Figura 1.9, algumas configuraes do compilador podem ser modifica-das. No entanto, isso no ser necessrio. Basta clicar em Finish.
F IG U RA 1 . 9
-
5/20/2018 Linguagem c Completa e Descomp
13/367
Introduo 7
8) Ao fim desses passos, o esqueleto de um novo programa C ter sido criado, comomostra a Figura 1.10.
F IG U RA 1 . 1 0
9) Por fim, podemos utilizar as seguintes opes do menu Buildpara compilar eexecutar nosso programa:
Compile current file (Ctrl+Shift+F9): essa opo vai transformar seu arquivode cdigo-fonte em instrues de mquina e gerar um arquivo do tipo objeto.
Build (Ctrl+F9): sero compilados todos os arquivos do seu projeto para fazero processo de linkagem com tudo o que necessrio para gerar o executveldo seu programa.Build and run (F9): alm de gerar o executvel, essa opo tambm executa oprograma gerado.
1.2.2 Utilizando o debugger do Code::Blocks
Com o passar do tempo, nosso conhecimento sobre programao cresce, assimcomo a complexidade de nossos programas. Surge ento a necessidade de examinar
o nosso programa procura de erros ou defeitos no cdigo-fonte. Para realizar essatarefa, contamos com a ajuda de um depuradorou debugger.
O debuggernada mais do que um programa de computador usado para testar edepurar (limpar, purificar) outros programas. Entre as principais funcionalidades deum debugger esto:
A possibilidade de executar um programa passo a passo.Pausar o programa em pontos predefinidos, chamados pontos de parada oubreakpoints, para examinar o estado atual de suas variveis.
Para utilizar o debugger do Code::Blocks, imagine o cdigo na Figura 1.11.
-
5/20/2018 Linguagem c Completa e Descomp
14/367
8 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
Exemplo: cdigo para o debugger
01
02
03
0405
06
07
08
09
10
11
12
13
14
15
1617
18
19
20
21
22
23
24
25
26
#include
#include
int fatorial(int n){
int i,f = 1;
for(i = 1; i 0){
printf(X eh positivo\n);
y = fatorial(x);
printf(Fatorial de X eh %d\n,y); }else{
if(x < 0)
printf(X eh negativo\n);
else
printf(X eh Zero\n);
}
printf(Fim do programa!\n);
system(pause);
return0;
}
F IG U RA 1 . 1 1
Todas as funcionalidades do debugger podem ser encontradas no menu Debug.Um programa pode ser facilmente depurado seguindo estes passos:
1) Primeiramente, vamos colocar dois pontos de parada ou breakpointsno progra-ma, nas linhas 13 e 23. Isso pode ser feito de duas maneiras: clicando no ladodireito do nmero da linha ou colocando o cursor do mouse na linha em que sedeseja adicionar o breakpoint e selecionar a opo Toggle breakpoint (F5). Umbreakpoint identificado por uma bolinha vermelha na linha (Figura 1.12).
2) Iniciamos o debugger com a opo Start (F8). Isso far com que o programa sejaexecutado normalmente at encontrar um breakpoint. No nosso exemplo, o usu-rio dever digitar, no console, o valor lido pelo comando scanf()e depois retornarpara a tela do Code::Blocksonde o programa se encontra pausado. Note que existeum tringulo amarelo dentro do primeiro breakpoint. Esse tringulo indica emque parte do programa a pausa est (Figura 1.13).
-
5/20/2018 Linguagem c Completa e Descomp
15/367
Introduo 9
F IG U RA 1 . 1 2
F IG U RA 1 . 1 3
3) Dentro da opo Debugging windows, podemos habilitar a opo Watches. Essaopo vai abrir uma pequena janela que permite ver o valor atual das variveis deum programa, assim como o valor passado para funes. Outra maneira de acessar
a janela Watches mudar a perspectiva do software para a opo Debugging, nomenu View, Perspectives (Figura 1.14).
-
5/20/2018 Linguagem c Completa e Descomp
16/367
10 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
F IG U RA 1 . 1 4
4) A partir de determinado ponto de pausa do programa, podemos nos mover para aprxima linha do programa com a opo Next line (F7). Essa opo faz com que oprograma seja executado passo a passo, sempre avanando para a linha seguinte doescopo onde nos encontramos.
5) Frequentemente, pode haver uma chamada a uma funo construda pelo progra-mador em nosso cdigo, como o caso da funo fatorial(). A opo Next line(F7)chama a funo, mas no permite que a estudemos passo a passo. Para entrardentro do cdigo de uma funo, utilizamos a opo Step into (Shift+F7)na linhada chamada da funo. Nesse caso, o tringulo amarelo que marca onde estamos nocdigo vai para a primeira linha do cdigo da funo (linha 4, Figura 1.15).
F IG U RA 1 . 1 5
-
5/20/2018 Linguagem c Completa e Descomp
17/367
Introduo 11
6) Uma vez dentro de uma funo, podemos percorr-la passo a passo com a opoNext line (F7). Terminada a funo, o debugger vai para a linha seguinte ao pontodo cdigo que chamou a funo (linha 16). Caso queiramos ignorar o resto dafuno e voltar para onde estvamos no cdigo que chamou a funo, basta clicarna opo Step out (Shift+Ctrl+F7).
7) Para avanar todo o cdigo e ir direto para o prximo breakpoint, podemos usar aopo Continue (Ctrl+F7).
8) Por fim, para parar o debugger, basta clicar na opo Stop debugger.
1.3 ESQUELETO DE UM PROGRAMA EM LINGUAGEM C
Todo programa escrito em linguagem C que vier a ser desenvolvido deve possuir oesqueleto mostrado no cdigo-fonte da Figura 1.16.
Exemplo: primeiro programa em linguagem C
01
02
03
04
05
06
07
#include
#include
int main(){
printf(Hello World \n);
system(pause);
return0;
}
F IG U RA 1 . 1 6
primeira vista, esse parece ser um programa ftil, j que sua nica finalidade mostrar na tela uma mensagem dizendo Hello World, fazer uma pausa e terminar oprograma. Porm, ele permite aprender alguns dos conceitos bsicos da linguagem C,como mostra a Figura 1.17.
F IG U RA 1 . 1 7
-
5/20/2018 Linguagem c Completa e Descomp
18/367
12 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
A seguir, apresentada uma descrio mais detalhada do esqueleto do programa:
Temos, no incio do programa, a regio onde so feitas as suas declaraes glo-bais, ou seja, aquelas que so vlidas para todo o programa. No exemplo, ocomando #include utilizado para declarar as biblio-tecas que sero utilizadas. Uma biblioteca um conjunto de funes (pedaosde cdigo) j implementados e que podem ser utilizados pelo programador. Noexemplo anterior, duas bibliotecas foram adicionadas ao programa:stdio.h(quecontm as funes de leitura do teclado e escrita em tela) e stdlib.h.Todo o programa em linguagem C deve conter a funo main(). Essa funo responsvel pelo incio da execuo do programa, e dentro dela que colocamosos comandos que queremos que o programa execute.As chaves definem o incio ({) e o fim (}) de um bloco de comandos/instru-es. No exemplo, as chaves definem o incio e o fim do programa.A funo main() foi definida como uma funo int (ou seja, inteira) e, porisso, precisa devolver um valor inteiro. Temos ento a necessidade do comandoreturn 0apenas para informar que o programa chegou ao seu final e que esttudo OK.A funo printf()est definida na biblioteca stdio.h. Ela serve para imprimiruma mensagem de texto na tela do computador (ou melhor, em uma janelaMSDOS ou shell no Linux). O texto a ser escrito deve estar entre aspas duplas,e, dentro dele, podemos tambm colocar caracteres especiais, como o \n, queindica que para mudar de linha antes de continuar a escrever na tela.O comando system(pause)serve para interromper a execuo do programa(fazer uma pausa) para que se possa analisar a tela de sada, aps o trmino daexecuo do programa. Ela est definida dentro da biblioteca stdlib.h.A declarao de um comando quase sempretermina com ponto e vrgula (;). Nasprximas sees, veremos quais comandos no terminam com ponto e vrgula.Os parnteses definem o incio (() e o fim ()) da lista de argumentos de umafuno. Um argumento a informao que ser passada para a funo agir. Noexemplo, podemos ver que os comandos main, printfe systemso funes.
1.3.1 Indentao do cdigo
Outra coisa importante que devemos ter em mente quando escrevemos um progra-ma a indentao do cdigo. Trata-se de uma conveno de escrita de cdigos-fonteque visa a modificar a esttica do programa para auxiliar a sua leitura e interpretao.
A indentao torna a leitura do cdigo-fonte muito mais fcil e facilita a sua
modificao.
-
5/20/2018 Linguagem c Completa e Descomp
19/367
Introduo 13
A indentao o espaamento (ou tabulao) colocado antes de comear a escre-ver o cdigo na linha. Ela tem como objetivo indicar a hierarquia dos elementos. Nonosso exemplo, os comandos printf(), system()e returnpossuem a mesma hierarquia(portanto, o mesmo espaamento) e esto todos contidos dentro do comando main()(da o porqu do espaamento).
O ideal sempre criar um novo nvel de indentao para um novo bloco de comandos.
A indentao importante, pois o nosso exemplo anterior poderia ser escrito emapenas trs linhas, sem afetar o seu desempenho, mas com alto grau de dificuldade deleitura para o programador (Figura 1.18).
Exemplo
01
02
03
#include
#include
int main(){printf(Hello World \n); system(pause); return0;}
F IG U RA 1 . 1 8
1.4 A COMPILAO DO PROGRAMA
O cdigo-fonte de um programa nada mais do que um conjunto de palavras e/
ou smbolos. Nele esto as instrues do que o programa deve fazer. O cdigo-fonte normalmente escrito de uma forma que facilite a leitura pelos seres humanos, no casoo programador. Ele no tem nenhum significado para o computador, que somenteentende cdigos de mquina. Para fazer com que nosso cdigo-fonte seja entendidocomo um programa pelo computador, preciso traduzi-lo para esse cdigo de mqui-na. A essa traduo damos o nome compilao.
A compilao permite o desenvolvimento de programas que so independentes damquina que estamos utilizando. Podemos escrever um nico cdigo-fonte e compilarem diferentes mquinas. A compilao vulgarmente entendida como apenas uma
etapa de traduo, mas na verdade ela um conjunto de etapas:
Pr-processamento : antes de iniciar a compilao do nosso cdigo-fonte, oarquivo processado por um pr-processador. O arquivo de cdigo-fonte con-vertido em outro arquivo de cdigo-fonte expandido. Nessa etapa, ocorrem aremoo dos comentrios e a interpretao das diretivas de compilao utiliza-das, as quais se iniciam com #.
Verificao sinttica : aqui se verifica se o cdigo-fonte foi escrito corretamente,de acordo com a linguagem C. Basicamente, a verificao sinttica procura por
erros de sintaxe como, por exemplo, parnteses que no foram fechados, falta deponto e vrgula no final de uma instruo etc.
-
5/20/2018 Linguagem c Completa e Descomp
20/367
14 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
Compilao : cada arquivo de cdigo-fonte do seu programa processado, sen-do criado um arquivo objeto para cada um deles. Nessa etapa, no geradonenhum arquivo que o usurio possa executar. Em vez disso, o compiladorproduz as instrues de linguagem de mquina que correspondem ao arquivode cdigo-fonte compilado.Link-edio : o trabalho do link-editor unir todos os arquivos objeto quefazem parte do programa em um nico arquivo executvel, o programa propria-mente dito. Isso inclui tanto os arquivos objeto gerados na etapa de compilaoa partir dos arquivos de cdigo-fonte do programa como os arquivos objeto queforam gerados a partir das bibliotecas usadas.
1.5 COMENTRIOS
Um comentrio, como o prprio nome diz, um trecho de texto includo dentrodo programa para descrever alguma coisa, por exemplo, o que aquele pedao do pro-grama faz. Os comentrios no modificam o funcionamento do programa porque soignorados pelo compilador e servem, portanto, apenas para ajudar o programador aorganizar o seu cdigo.
Um comentrio pode ser adicionado em qualquer parte do cdigo. Para tanto, a lingua-gem C permite fazer comentrios de duas maneiras diferentes: por linha ou por bloco.
Se o programador quiser comentar uma nica linha do cdigo, basta adicionar
// na frente da linha. Tudo o que vier na linha depois do // ser consideradocomentrio e ignorado pelo compilador.Se o programador quiser comentar mais de uma linha do cdigo, isto , umbloco de linhas, basta adicionar /* no comeo da primeira linha de comentrioe */ no final da ltima linha de comentrio. Tudo o que vier depois do smbolode /* e antes do */ ser considerado comentrio e ignorado pelo compilador.
Na Figura 1.19, tem-se alguns exemplos de comentrios em um programa.
Exemplo: comentrios no programa
01
02
03
04
05
06
07
08
09
10
11
12
13
#include
#include
int main(){
/*
A funcaoprintf()
serve para
escrever na tela
*/
printf(Hello World \n);
//faz uma pausa no programa
system(pause);
return0;
}
F IG U RA 1 . 1 9
-
5/20/2018 Linguagem c Completa e Descomp
21/367
Introduo 15
Outro aspecto importante do uso dos comentrios que eles permitem fazer adocumentao interna de um programa, ou seja, permitem descrever o que cada blo-co de comandos daquele programa faz. A documentao uma tarefa extremamenteimportante no desenvolvimento e na manuteno de um programa, mas muitas vezesignorada.
Os comentrios dentro de um cdigo permitem que um programador entendamuito mais rapidamente um cdigo que nunca tenha visto ou relembre o que faz umtrecho de cdigo h muito tempo implementado por ele. Alm disso, saber o que de-terminado trecho de cdigo realmente faz aumenta as possibilidades de reutiliz-lo emoutras aplicaes.
1.6 USANDO UMA BIBLIOTECA: O COMANDO #INCLUDE
O comando #include utilizado para declarar as bibliotecas que sero utilizadaspelo programa.
Uma biblioteca um arquivo contendo um conjunto de funes (pedaos de cdigo),
variveis, macros etc., j implementados e que podem ser utilizados pelo programador
em seu programa.
Esse comando diz ao pr-processador para tratar o contedo de um arquivo especi-ficado como se o seu contedo tivesse sido digitado no programa no ponto em que o
comando #include aparece.O comando #include permite duas sintaxes:
#include : o pr-processador procurar pela bibliotecanos caminhos de procura pr-especificados do compilador. Usamos essa sintaxequando estamos incluindo uma biblioteca que prpria do sistema, como asbiblotecas stdio.he stdlib.h.#include nome_da_biblioteca: o pr-processador procurar pela bibliotecano mesmo diretrio onde se encontra o nosso programa. Podemos ainda optar
por informar o nome do arquivo com o caminho completo, ou seja, em qualdiretrio ele se encontra e como chegar at l.
De modo geral, os arquivos de bibliotecas na linguagem C so terminados com a
extenso .h.
A seguir, temos dois exemplos do uso do comando #include:
#include
#include D:\Programas\soma.h
Na primeira linha, o comando #include utilizado para adicionar uma bibliotecado sistema: stdio.h(que contm as funes de leitura do teclado e escrita em tela).
-
5/20/2018 Linguagem c Completa e Descomp
22/367
16 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
J na segunda linha, o comando utilizado para adicionar uma biblioteca de nomesoma.h, localizada no diretrio D:\Programas.
1.6.1 Criando suas prprias bibliotecas
A linguagem C nos permite criar nossa prpria biblioteca. Nela, podemos colocarnossas funes, estruturas etc., o que torna mais prtica e fcil a sua utilizao em ou-tros projetos. Criar a sua prpria biblioteca no uma das tarefas mais difceis. De fato, bastante simples. Bibliotecas no so muito diferentes dos arquivos de cdigo-fonte.
Uma biblioteca como o seu arquivo de cdigo-fonte principal, com a diferena de que
ele no possui a funo main(). Isso ocorre porque o seu programa no vai comear na
biblioteca.
Antes de criar nossa biblioteca, vamos imaginar um programa que contenha um conjun-to de funes para operaes aritmticas, como mostrado no exemplo da Figura 1.20.
Exemplo: programa com funes aritmticas
01
02
03
04
05
06
0708
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include
#include
int soma(int a, int b){returna + b;}
int subtracao(int a, int b){returna - b;}
int produto(int a, int b){returna * b;}
int divisao(int a, int b){returna / b;}
int main(){ int x,y,z;
char ch;
printf(Digite uma operacao matematica (+,-,*,/): );
ch = getchar();
printf(Digite 2 numeros: );
scanf(%d %d,&x,&y);
switch(ch){
case+: z = soma(x,y);break;
case-: z = subtracao(x,y);break;
case*: z = produto(x,y);break;
case/: z = divisao(x,y);break;
default: z = soma(x,y);
}
printf(Resultado = %d\n,z);
system(pause);
return0;
}
F IG U RA 1 . 2 0
Nosso programa define quatro funes, que so as funes para operaes arit-mticas com inteiros: soma(), subtracao(), produto() e divisao(). Queremos criarum biblioteca que contenha essas funes para, num projeto futuro, apenas chamara biblioteca, reutilizando assim as funes. Para transformar essas funes em umabiblioteca, precisaremos criar dois arquivos:
-
5/20/2018 Linguagem c Completa e Descomp
23/367
Introduo 17
Cabealho (ou header) da biblioteca: esse arquivo contm as declaraes edefinies do que est contido dentro da biblioteca. Aqui so definidas quaisfunes (apenas o seu prottipo), tipos e variveis faro parte da biblioteca. Suaextenso .h.Cdigo-fonte da biblioteca : arquivo que contm a implementao das funesdefinidas no cabealho. Sua extenso .c.
Vamos chamar nossa biblioteca de aritmetica. Assim, teremos de criar dois arquivos:aritmetica.he aritmetica.c. Vamos comear pelo arquivo de cabealho aritmetica.h.Ele deve conter as definies do que consta na nossa biblioteca. Nesse caso, ele vai incluirapenas o prottipo de nossas quatro funes, como mostra o exemplo da Figura 1.21.
Exemplo: aritmetica.h
01
02
03
04
int soma(int a, int b);
int subtracao(int a, int b);
int produto(int a, int b);
int divisao(int a, int b);
F IG U RA 1 . 2 1
Em seguida, devemos criar o arquivo com as implementaes das nossas funes:aritmetica.c. Nesse arquivo sero codificadas nossas funes e tambm includa qual-quer biblioteca adicional de que nossas funes precisem para funcionar. Por exemplo,
se uma de nossas funes utilizasse a funo printf(), seria necessrio incluir a biblio-teca stdio.hno nosso arquivo.
Independentemente de precisarmos ou no incluir outras bibliotecas, devemos sempre
incluir nossa prpria biblioteca (aritmetica.h) no cdigo-fonte dela (aritmetica.c). Para
isso, usamos #include aritmetica.h.
Na Figura 1.22, podemos ver o arquivo de cdigo-fonte da nossa biblioteca.
Exemplo: aritmetica.c
01
02
03
04
05
06
07
08
09
10
11
12
13
#include aritmetica.h
int soma(int a, int b){
returna + b;
}
int subtracao(int a, int b){
returna - b;
}
int produto(int a, int b){
returna * b;
}
int divisao(int a, int b){
returna / b;
}
F IG U RA 1 . 2 2
-
5/20/2018 Linguagem c Completa e Descomp
24/367
18 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
Por fim, temos de incluir nossa biblioteca no nosso programa, o que mostrado naFigura 1.23. Note que agora no mais definimos nossas funes dentro do programaprincipal, pois elas so chamadas a partir da biblioteca que criamos.
Exemplo
01
02
03
04
05
06
07
08
09
1011
12
13
14
15
16
17
18
19
20
21
#include
#include
#include aritmetica.h //inclui nossa biblioteca
int main(){
int x,y,z;
char ch;
printf(Digite uma operacao matematica (+,-,*,/): );
ch = getchar();
printf(Digite 2 numeros: );
scanf(%d %d,&x,&y);
switch(ch){ case+: z = soma(x,y);break;
case-: z = subtracao(x,y);break;
case*: z = produto(x,y);break;
case/: z = divisao(x,y);break;
default: z = soma(x,y);
}
printf(Resultado = %d\n,z);
system(pause);
return0;
}
F IG U RA 1 . 2 3
Quando utilizamos a IDE Code::Blocks, pode ser necessrio incluir nossa biblio-teca no nosso projeto. Para isso, basta clicar com o boto direito do mouse no nomedo projeto, clicar na opo Add file e selecionar os dois arquivos que compem anossa biblioteca.
1.7 BIBLIOTECAS E FUNES TEIS DA LINGUAGEM C
1.7.1 Funes de entrada e sada:stdio.hOperaes em arquivos
int remove (const char *): apaga o arquivo.int rename (const char *,const char *): renomeia o arquivo.
Acesso a arquivos
int fclose (FILE *): fecha o arquivo.int fflush (FILE *): limpa o buffer. Dados no escritos no buffer de sada sogravados no arquivo.FILE * fopen (const char *, const char *): abre o arquivo.
void setbuf (FILE *, char *): controla o fluxo de armazenamento em buffer.
-
5/20/2018 Linguagem c Completa e Descomp
25/367
Introduo 19
Entrada/sada formatada
int fprintf (FILE *,const char *, ...): grava uma sada formatada em arquivo.int fscanf (FILE *,const char *, ...): l dados formatados a partir de arquivo.
int printf (const char *, ...): imprime dados formatados na sada-padro (monitor).int scanf (const char *, ...): l dados formatados da entrada-padro (teclado).int sprintf (char *, const char *, ...): grava dados formatados em uma string.int sscanf (const char *, const char *, int, ...): l dados formatados a partir deuma string.
Entrada/sada de caracteres
int fgetc (FILE *): l um caractere do arquivo.char * fgets (char *): l uma string do arquivo.int fputc (int, FILE *): escreve um caractere em arquivo.int fputs (const char *, FILE *): escreve uma string em arquivo.int getc (FILE *): l um caractere do arquivo.int getchar (void): l um caractere da entrada-padro (teclado).char * gets (char *): l uma string da entrada-padro (teclado).int putc (int, FILE *): escreve um caractere na sada-padro (monitor).int putchar (int): escreve um caractere na sada-padro (monitor).int puts (const char *): escreve uma string na sada-padro (monitor).int ungetc (int, FILE *): retorna um caractere lido para o arquivo dele.
Entrada/sada direta
size_t fread (void *, size_t, size_t, FILE *): l um bloco de dados do arquivo.size_t fwrite (const void *, size_t, size_t, FILE *): escreve um bloco de dadosno arquivo.
Posicionamento no arquivo
int fgetpos (FILE *, fpos_t *): retorna a posio atual no arquivo.int fseek (FILE *, long int, int): reposiciona o indicador de posio do arquivo.int fsetpos (FILE *, const fpos_t *): configura o indicador de posio do ar-quivo.long int ftell (FILE *): retorna a posio atual no arquivo.
void rewind (FILE *): reposiciona o indicador de posio do arquivo para oincio do arquivo.
Tratamento de erros
void clearerr (FILE *): limpa os indicadores de erro.int feof (FILE *): indicador de fim de arquivo.int ferror (FILE *): indicador de checagem de erro.
void perror (const char *): impresso de mensagem de erro.
-
5/20/2018 Linguagem c Completa e Descomp
26/367
20 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
Tipos e macros
FILE : tipo que contm as informaes para controlar um arquivo.EOF : constante que indica o fim de arquivo.
NULL : ponteiro nulo.
1.7.2 Funes de utilidade padro: stdlib.h
Converso de strings
double atof (const char *): converte string em double.int atoi (const char *): converte string em inteiro.long int atol (const char *): converte string em inteiro longo.double strtod (const char *, char **): converte string em doublee devolve umponteiro para o prximo doublecontido na string.long int strtol (const char *, char **, int): converte string em inteiro longo edevolve um ponteiro para o prximo inteiro longo contido na string.unsigned long int strtoul (const char *, char **, int): converte string em in-teiro longo sem sinal e devolve um ponteiro para o prximo inteiro longo semsinal contido na string.
Gerao de sequncias pseudoaleatrias
int rand (void): gera nmero aleatrio.void srand (unsigned int): inicializa o gerador de nmeros aleatrios.
Gerenciamento de memria dinmica
void * malloc (size_t): aloca espao para um array na memria.void * calloc (size_t, size_t): aloca espao para um array na memria e inicializacom zeros.
void free (void *): libera o espao alocado na memria.void * realloc (void *, size_t): modifica o tamanho do espao alocado na memria.
Ambiente do programa
void abort (void): aborta o processo atual.int atexit (void(*)(void)): define uma funo a ser executada no trmino nor-mal do programa.
void exit (int): finaliza o programa.char * getenv (const char *): retorna uma varivel de ambiente.int system (cosnt char *): executa um comando do sistema.
Pesquisa e ordenao
void* bsearch (const void *, const void *, size_t, size_t,int (*)(const void *,const void *)): pesquisa binria em um array.
void qsort (void *, size_t, size_t, int (*)(const void *,const void *)): ordena oselementos de um array.
-
5/20/2018 Linguagem c Completa e Descomp
27/367
Introduo 21
Aritmtica de inteiro
int abs (int): valor absoluto.div_t div (int, int): diviso inteira.
long int labs (long int): valor absoluto de um inteiro longo.ldiv_t ldiv (long int, long int): diviso inteira de um inteiro longo.
1.7.3 Funes matemticas: math.h
Funes trigonomtricas
double cos (double): calcula o cosseno de um ngulo em radianos.double sin (double): calcula o seno de um ngulo em radianos.double tan (double): calcula a tangente de um ngulo em radianos.double acos (double): calcula o arco cosseno de um ngulo em radianos.double asin (double): calcula o arco seno de um ngulo em radianos.double atan (double): calcula o arco tangente de um ngulo em radianos.double atan2 (double, double): calcula o arco tangente com dois parmetros.
Funes hiperblicas
double cosh (double): calcula o cosseno hiperblico de um ngulo em radianos.double sinh (double): calcula o seno hiperblico de um ngulo em radianos.double tanh (double): calcula a tangente hiperblica de um ngulo em radianos.double acosh (double): calcula o arco cosseno hiperblico de um ngulo em ra-
dianos.double asinh (double): calcula o arco seno hiperblico de um ngulo em ra-dianos.double atanh (double): calcula o arco tangente hiperblico de um ngulo emradianos.
Funes exponenciais e logartmicas
double exp (double): funo exponencial.double frexp (double, int *): extrai a mantissa e o expoente de um valor double.
double log (double): logaritmo natural.double log10 (double): logaritmo comum (base 10).double modf (double, double*): quebra um nmero em partes fracionrias einteira.
Constantes
M_E : valor de e.M_LOG2E : valor de log 2e.M_LOG10E : valor de log 10e.M_PI : valor de .M_1_PI : valor de 1/ .M_SQRT2 : valor de 2.
-
5/20/2018 Linguagem c Completa e Descomp
28/367
22 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
Funes de potncia
double pow (double, double): retorna a base elevada ao expoente.double sqrt (double): raiz quadrada de um nmero.
Funes de arredondamento, valor absoluto e outras
double ceil (double): arredonda para cima um nmero.double fabs (double): calcula o valor absoluto de um nmero.double floor (double): arredonda para baixo um nmero.double fmod (double, double): calcula o resto da diviso.
1.7.4 Testes de tipos de caracteres:ctype.h
int isalnum (int): verifica se o caractere alfanumrico.int isalpha (int): verifica se o caractere alfabtico.int iscntrl (int): verifica se o caractere um caractere de controle.int isdigit (int): verifica se o caractere um dgito decimal.int isgraph : verifica se o caractere tem representao grfica visvel.int islower (int): verifica se o caractere letra minscula.int isprint (int): verifica se o caractere imprimvel.int ispunct (int): verifica se um caractere de pontuao.int isspace (int): verifica se o caractere um espao em branco.int isupper (int): verifica se o caractere letra maiscula.int isxdigit (int): verifica se o caractere dgito hexadecimal.int tolower (int): converte letra maiscula em minscula.int toupper (int): converte letra minscula em maiscula.
1.7.5 Operaes em string:string.h
Cpia
void * memcpy (void *, const void *, size_t): cpia de bloco de memria.void * memmove (void *, const void *, size_t): move bloco de memria.char * strcpy (char *, const char *): cpia de string.char * strncpy (char *, const char *, size_t): cpia de caracteres da string.
Concatenao
char * strcat (char *, const char *): concatenao de strings.char * strncat (char *, const char *, size_t): adiciona n caracteres de umastring no final de outra string.
Comparao
int memcmp (const void *, const void *, size_t): compara dois blocos dememria.
-
5/20/2018 Linguagem c Completa e Descomp
29/367
Introduo 23
int strcmp (const char *, const char *): compara duas strings.int strcoll (const char *, const char *): compara duas strings usando as confi-guraes da localidade atual.int strncmp (const char *, const char *, size_t): compara os n caracteres deduas strings.
Busca
void * memchr (const void *, int, size_t): localiza caractere em bloco de me-mria.char * strchr (const char *, int): localiza primeira ocorrncia de caractere emuma string.size_t strcspn (const char *, const char *): retorna o nmero de caracteres lidosde uma string antes da primeira ocorrncia de uma segunda string.char * strpbrk (const char *, const char *): retorna um ponteiro para a primeiraocorrncia na string de qualquer um dos caracteres de uma segunda string.char * strrchr (const char *, int): retorna um ponteiro para a ltima ocorrnciado caratere na string.size_t strspn (const char *, const char *): retorna o comprimento da string queconsiste s em caracteres que fazem parte de uma outra string.char * strstr (const char *, const char *): procura a primeira ocorrncia da se-gunda string dentro da primeira.char * strtok (char *, const char *): divide uma string em substrings com base
em um caractere.
Outras
void * memset (void *, int size_t): preenche bloco de memria com valor es-pecificado.char * strerror (int): retorna o ponteiro para uma string de mensagem de erro.size_t strlen (const char *): comprimento da string.
1.7.6 Funes de data e hora: time.hManipulao do tempo
clock_t clock (void): retorna o nmero de pulsos de clock decorrido desde queo programa foi lanado.double difftime (time_t, time_t): retorna a diferena entre dois tempos.time_t mktime (struct tm *): converte uma estrutura tm em tipo time_t.time_t time (time_t *): retorna o tempo atual do calendrio como um time_t.
Converso
char * asctime (const struct tm *): converte uma estrutura tm em string.char * ctime (const time_t *): converte um valor time_t em string.
-
5/20/2018 Linguagem c Completa e Descomp
30/367
24 L I N G U AG EM C C O M PL ET A E DES C O M PL I C ADA
struct tm * gmtime (const time_t *): converte um valor time_t em estrutura tmcomo tempo UTC.struct tm * localtime (const time_t *): converte um valor time_t em estruturatm como hora local.time_t strftime (char *, size_t, const char *, const struct tm *): converte otempo armazenado em uma estrutura tm para string.
Tipos e macros
CLOCKS_PER_SEC : nmero de pulsos de clock em um segundo.clock_t : tipo capaz de representar as contagens clock e suportar operaes arit-mticas.size_t : tipo inteiro sem sinal.time_t : tipo capaz de representar os tempos e suportar operaes aritmticasstruct tm : estrutura contendo data e hora divididas em seus componentes, comodescrito a seguir:
int tm_sec : segundos aps minutos [0,61].int tm_min : minutos aps hora [0,59].int tm_hour : horas desde a meia-noite [0,23].int tm_mday : dia do ms [1,31].int tm_mon : ms do ano [0,11].int tm_year : anos desde 1900.int tm_wday : dia da semana [0,6] (domingo = 0).int tm_yday : dia do ano [0,365].int tm_isdst : flag para horrio de vero.
Usando a funo strftime()
Basicamente, a funo strftime()converte o tempo armazenado em uma estruturatmpara string. Como a funo printf(), essa tambm possui um conjunto de especifica-dores de tipo de sada para formatar o valor da data e hora de acordo com a informaoque desejamos exibir. A Tabela 1.1 apresenta os especificadores que podem ser usadoscom essa funo. Note que os especificadores cuja descrio est marcada com asterisco(*) so dependentes da configurao de localidade, ou seja, podem ser modificados paraimprimir seus valores de acordo com a configurao usada no computador.
Especificador Descrio Exemplo
%a Dia da semana abreviado * Thu
%A Dia da semana completo * Thursday
%b Nome do ms abreviado * Aug
%B Nome do ms completo * August
%c Representao da data e hora * Thu Aug 23 14:55:02 2001%d Dia do ms (01-31) 23
-
5/20/2018 Linguagem c Completa e Descomp
31/367
Introduo 25
Especificador Descrio Exemplo
%H Hora no formato 24 h (00-23) 14
%I Hora no formato 12 h (01-12) 02
%j Dia do ano (001-366) 235
%m Ms como valor inteiro (01-12) 08
%M Minuto (00-59) 55
%p Designao AM ou PM PM
%S Segundo (00-61) 02
%U Nmero da semana com o primeiro domingo
como o primeiro dia da semana um (00-53)
33
%w Dia da semana como um valor inteiro com
domingo como 0 (0-6)
4
%W Nmero da semana com a primeira segunda-feiracomo o primeiro dia da semana um (00-53)
34
%x Representao da data * 08/23/01
%X Representao da hora * 14:55:02
%y Ano, dois ltimos dgitos (00-99) 01
%Y Ano 2001
%Z Nome do fuso horrio ou abreviao CDT
%% Smbolo % %
TA BELA 1 . 1
Na Figura 1.24, tem-se alguns exemplos de formatao de data e hora utilizando afuno strftime().
Exemplo
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
#include
#include
#include
int main(){
time _ t tempo;
struct tm *infotempo;
char texto[80];
time(&tempo);
infotempo = localtime(&tempo);
strftime(texto,80,Hora atual %I:%M%p.,infotempo);
puts(texto);
strftime(texto,80,Data: %A, %d/%b/%Y,infotempo);
puts(texto);
system(pause);
return0;
}
F IG U RA 1 . 2 4
-
5/20/2018 Linguagem c Completa e Descomp
32/367
CAP T U L O 2
Lendo e escrevendonas variveis
Afinalidade deste captulo apresentar ao leitor os conceitos de variveis e leiturae escrita de dados na linguagem C. Ao final, o leitor ser capaz de:
Declarar variveis.Definir com preciso o tipo da varivel.Escrever suas variveis na tela.Ler suas variveis do teclado.
Determinar o escopo da varivel.Declarar e utilizar constantes.
2.1 VARIVEIS
Toda informao contida dentro de um programa est armazenada na memriado computador. Nossos dados, em particular, esto sempre guardados dentro de uma
varivel. O conceito de varivel varia um pouco a depender da rea. Na matemtica,uma varivel uma entidade capaz de representar um valor ou expresso. Ela pode
representar um nmero ou um conjunto de nmeros, como na equao
x2+ 2x+ 1 = 0
ou na funof (x) =x2
J em computao, uma varivel uma posio de memria onde poderemos guar-dar determinado dado ou valor e modific-lo ao longo da execuo do programa.Quando criamos uma varivel e armazenamos um valor dentro dela (por exemplo,
int x = 10;), o computador reserva um espao associado a um endereo de memriaonde podemos guardar o valor dessa varivel, como mostra a Figura 2.1.
-
5/20/2018 Linguagem c Completa e Descomp
33/367
28 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
FIGURA 2.1
Desse modo, podemos recuperar esse valor ao longo do programa e utiliz-lo nasmais diversas operaes, como ser mostrado a seguir.
2.1.1 Declarando uma varivel
Em linguagem C, a declarao de uma varivel pelo programador segue a esta for-ma geral:
tipo_da_varivelnome_da_varivel;
O tipo_da_variveldetermina o conjunto de valores e de operaes que uma vari-
vel aceita, ou seja, que ela pode executar. J o nome_da_varivel como o programadoridentifica essa varivel dentro do programa. Ao nome da varivel o computador associa oendereo do espao que ele reservou na memria para guard-la.
Suponha que queiramos declarar uma varivel do tipo inteiro e de nome x. Elapode ser facilmente declarada como apresentado a seguir:
int x;
Alm disso, mais de uma varivel pode ser declarada para um mesmo tipo ao mes-mo tempo. Para tanto, basta separar cada nome de varivel por umavrgula(,):
int x,y,z;
Toda declarao de variveis termina com o operador deponto e vrgula(;).
Isso necessrio uma vez que o operador de ponto e vrgula utilizado para sepa-rar as instrues da linguagem C que compem um programa de computador.
Uma varivel deve ser sempre declarada antes de ser usada dentro do programa.
-
5/20/2018 Linguagem c Completa e Descomp
34/367
Lendo e escrevendo nas variveis 29
Lembre-se: apenas quando declaramos uma varivel que o computador reservaum espao de memria para guardarmos nossos dados. Assim, no possvel usar esseespao antes de t-lo reservado na memria.
Antes de usar o contedo de uma varivel, tenha certeza de que ele foi definido
antes.
01
02
03
04
05
06
07
08
09
10
#include
#include
int main(){ int x;//declara a variavel mas nao define o valor
printf(x = %d\n,x);
x = 5;//define o valor de x como sendo 5
printf(x = %d\n,x);
system(pause);
return0;
}
Sada x = qualquer valor!
x = 5
Quando falamos em memria do computador, no existe o conceito de posiode memria vazia. Toda posio de memria do computador est preenchida comum conjunto de 0s e 1s. O que ocorre que a posio de memria pode apenas noestar sendo utilizada. Portanto, ao criarmos uma varivel, o computador seleciona umaposio que no estava sendo usada para guardar a nossa varivel e, portanto, ela au-
tomaticamente estar preenchida com um valor chamado de lixo de memria: umconjunto de 0s e 1s sem significado para o nosso programa.
2.1.2 Dando um nome a nossa varivel
Quando criamos uma varivel, o computador reserva um espao de memria ondepodemos guardar o valor associado a ela. Ao nome que damos a essa varivel o com-putador associa o endereo do espao que ele reservou na memria para guard-la.De modo geral, interessa ao programador saber o nome das variveis. Porm, existem
algumas regras para a escolha dos nomes das variveis na linguagem C.
O nome de uma varivel um conjunto de caracteres que podem ser letras,nmeros ou underscores (_).O nome de uma varivel deve sempre iniciar com uma letra ou o underscore (_).
Na linguagem C, letras maisculas e minsculas so consideradas diferentes.
A linguagem C case-sensitive, ou seja, uma palavra escrita utilizando caracteresmaisculos diferente da mesma palavra escrita com caracteres minsculos. Sendo
-
5/20/2018 Linguagem c Completa e Descomp
35/367
30 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
assim, as palavras Soma, somae SOMAso consideradas diferentes para a linguagemC e representam TRSvariveis distintas.
Palavras-chave no podem ser usadas como nome de variveis.
As palavras-chave so um conjunto de 32 palavras reservadas dentro da linguagemC. So elas que formam a sintaxe da linguagem de programao C. Essas palavras jpossuem funes especficas dentro da linguagem de programao e, por esse motivo,no podem ser utilizadas para outro fim, como para nomes de variveis. Na Figura 2.2,tem-se uma lista com as 32 palavras reservadas da linguagem C.
Lista de palavras-chave da linguagem C
auto double int struct break else long switch
case enum if typeof continue float return while
union const for short unsigned char extern signed
void default do sizeof volatile goto register static
FIGURA 2.2
O exemplo na Figura 2.3 apresenta alguns nomes possveis de variveis e outros quefogem s regras estabelecidas.
Exemplo: nomeando variveis
comp! .var int 1var 1cont -x Va-123
cont Cont Val_123 _teste Int1 Cont1 X
FIGURA 2.3
2.1.3 Definindo o tipo de nossa varivel
Vimos anteriormente que o tipo de uma varivel determina o conjunto de valorese de operaes que uma varivel aceita, ou seja, que ela pode executar. A linguagem Cpossui um total de cinco tipos de dados bsicos (Tabela 2.1).
Tipo Bits Intervalo de valores
char 8 -128 A 127
int 32 -2.147.483.648 A 2.147.483.647
float 32 1,175494E-038 A 3,402823E+038
double 64 2,225074E-308 A 1,797693E+308
void 8 sem valor
TA BELA 2.1
-
5/20/2018 Linguagem c Completa e Descomp
36/367
Lendo e escrevendo nas variveis 31
O tipo char
Comecemos pelo tipo char. Esse tipo de dados permite armazenar em um nicobyte (8 bits) um nmero inteiro muito pequeno ou o cdigo de um caractere do con-
junto de caracteres da tabelaASCII:char c = a;
char n = 10;
Caracteres sempre ficam entre aspas simples!
Lembre-se: uma nica letra pode ser o nome de uma varivel. As aspas simplespermitem que o compilador saiba que estamos inicializando nossa varivel com umcaractere e no com o contedo de outra varivel.
O tipo int
O segundo tipo de dado o tipo inteiro: int. Esse tipo de dados permite armazenarum nmero inteiro (sem parte fracionria). Seu tamanho depende do processador emque o programa est rodando e tipicamente 16 ou 32 bits:
int n = 1459;
Cuidado com a forma como voc inicializa as variveis dos tipos char e int.
Na linguagem C, os tipos char e int podem ser especificados nas bases decimal,octalou hexadecimal. A base decimal a base-padro. Porm, se o valor inteiro forprecedido por:
0, ele ser interpretado como octal. Nesse caso, o valor deve ser definido uti-lizando os dgitos de 0, 1, 2, 3, 4, 5, 6 e 7. Ex.: int x = 044. Nesse caso, 044equivale a 36 (4 81+ 4 80).
0x ou 0X, ele ser interpretado como hexadecimal. Nesse caso, o valor deveser definido utilizando os dgitos de 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9, e as letras A (10),B (11), C (12), D (13), E (14) e F (15). Ex.: int y = 0x44. Nesse caso, 0x44equivale a 68 (4 161+ 4 160).
Na Figura 2.4 podemos ver um exemplo.
-
5/20/2018 Linguagem c Completa e Descomp
37/367
32 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
Exemplo
01
02
03
0405
06
07
08
09
10
11
12
#include
#include
int main(){
int a = 125;//valor em decimal int b = 0435;//valor em octal, equivale a 285
int c = 0x1FA;//valor em hexadecimal, equivale a 506
printf(Valor de a: %d\n,a);
printf(Valor de b: %d\n,b);
printf(Valor de c: %d\n,c);
system(pause);
return0;}
FIGURA 2.4
Os tipos floate doubleO terceiro e o quarto tipo de dados so os tipos reais: float e double. Esses tipos de
dados permitem armazenar um valor real (com parte fracionria), tambm conhecidocomo ponto flutuante. A diferena entre eles a sua preciso:
Tipo float: preciso simples.Tipo double: dupla preciso.
So teis quando queremos trabalhar com intervalos de nmeros reais realmentegrandes.
Em nmeros reais, a parte decimal usa ponto, e no vrgula!
A linguagem C usa o padro numrico americano, ou seja, a parte decimal ficadepois de um ponto. Veja os exemplos:
float f = 5.25;
double d = 15.673;
Pode-se escrever nmeros dos tipos float e double usando notao cientfica.
A notao cientfica uma forma de escrever nmeros extremamente grandes ouextremamente pequenos. Nesse caso, o valor real seguido por uma letra e ou Ee um nmero inteiro (positivo ou negativo), que indica o expoente da base 10 (repre-sentado pela letra e ou E que multiplica o nmero):
double x = 5.0e10;
equivale adouble x = 50000000000;
-
5/20/2018 Linguagem c Completa e Descomp
38/367
Lendo e escrevendo nas variveis 33
O tipo void
Por fim, temos o tipovoid. Esse tipo de dados permite declarar uma funo queno retorna valor ou um ponteiro genrico, como ser visto nas prximas sees.
A linguagem C no permite que se declare uma varivel do tipo void. Esse tipo de
dados s deve ser usado para declarar funes que no retornam valor ou ponteiro
genrico.
2.1.4 Os modificadores de tipo de uma varivel
Alm dos cinco tipos bsicos, a linguagem C possui quatro modificadores de ti-pos. Eles so aplicados precedendo os tipos bsicos (com a exceo do tipo void), epermitem alterar o significado do tipo, de modo a adequ-lo s necessidades do nosso
programa. So eles:
signedunsignedshortlong
O modificador signed
Esse modificador determina que uma varivel declarada dos tipos char ou int po-
der ter valores positivos ou negativos. Trata-se do modo-padro de definio devariveis desses tipos, e, por esse motivo, raramente usado. Exemplo:
signed char x;
signed int y;
O modificador unsigned
Esse modificador determina que uma varivel declarada dos tipos char ou int so-mente poder ter valores positivos e o valor zero. Nesse caso, a varivel perde seu bitde sinal, o que dobra a sua capacidade de armazenamento para valores positivos. Por
exemplo, uma varivel do tipo char capaz de armazenar valores de 128 at 127. Sea mesma varivel for declarada como sendo do tipo unsigned char, ela ser capaz dearmazenar valores de 0 at 255. A seguir, dois exemplos de uso:
unsigned char x;
unsigned int y;
O modificador short
O modificador short determina que uma varivel do tipo int ter apenas 16 bits(inteiro pequeno), independentemente do processador. Exemplo:
short int i;
-
5/20/2018 Linguagem c Completa e Descomp
39/367
34 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
O modificador long
Faz o inverso do modificador short. O modificador longdetermina que uma va-rivel do tipo int ter 32 bits (inteiro grande), independentemente do processador.
Tambm determina que o tipo double possua maior preciso. Exemplo:long int n;
long double d;
Usando mais de um modificador ao mesmo tempo
A linguagem C permite que se utilize mais de um modificador de tipo sobre um mesmo
tipo.
Isso permite, por exemplo, declarar um inteiro grande (ou seja, com 32 bits) usan-do o modificador (long) e que tambm seja sem sinal (unsigned). Essa combinaopermite aumentar em muito o intervalo de valores possveis para aquela varivel:
unsigned long int m;
Tipos e combinaes de modificadores possveis
A Tabela 2.2 mostra todas as combinaes permitidas dos tipos bsicos e dos mo-dificadores de tipo, o seu tamanhos em bits e o seu intervalo de valores.
Tipo Bits Intervalo de valores
char 8 -128 A 127
unsigned char 8 0 A 255
signed char 8 -128 A 127
int 32 -2.147.483.648 A 2.147.483.647
unsigned int 32 0 A 4.294.967.295
signed int 32 -32.768 A 32.767
short int 16 -32.768 A 32.767
unsigned short int 16 0 A 65.535
signed short int 16 -32.768 A 32.767
long int 32 -2.147.483.648 A 2.147.483.647
unsigned long int 32 0 A 4.294.967.295
signed long int 32 -2.147.483.648 A 2.147.483.647
float 32 1,175494E-038 A 3,402823E+038
double 64 2,225074E-308 A 1,797693E+308
long double 96 3,4E-4932 A 3,4E+4932
TA BELA 2.2
-
5/20/2018 Linguagem c Completa e Descomp
40/367
Lendo e escrevendo nas variveis 35
2.2 ESCREVENDO SUAS VARIVEIS NA TELA
2.2.1 Printf
A funo printf() uma das funes de sada/escrita de dados da linguagem C.Seu nome vem da expresso em inglsprint formatted, ou seja, escrita formatada. Ba-sicamente, a funo printf()escreve na sada de vdeo (tela) um conjunto de valores,caracteres e/ou sequncia de caracteres de acordo com o formato especificado. A formageral da funo printf():
printf(tipos de sada, lista de variveis)
A funo printf()recebe dois parmetros de entrada:
tipos de sada : conjunto de caracteres que especifica o formato dos dados aserem escritos e/ou o texto a ser escrito.lista de variveis : conjunto de nomes de variveis, separados por vrgula, quesero escritos.
Escrevendo uma mensagem de texto
A forma geral da funo printf()especifica que ela sempre receber uma lista devariveis para formatar e escrever na tela. Porm, isso nem sempre verdadeiro. Afuno printf()pode ser usada quando queremos escrever apenas uma mensagem de
texto simples na tela:
Note que o texto a ser escrito deve ser sempre definido entre aspas duplas. A Figu-ra 2.5 mostra um exemplo.
Exemplo: escrevendo um texto na tela
01
02
03
04
05
06
07
#include
#include
int main(){
printf(Esse texto sera escrito na tela);
system(pause);
return0;
}
Sada Esse texto sera escrito na tela
FIGURA 2.5
-
5/20/2018 Linguagem c Completa e Descomp
41/367
36 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
Escrevendo valores formatados
Quando queremos escrever dados formatados na tela usamos a forma geral da fun-o, a qual possui os tipos de sada. Eles especificam o formato de sada dos dados
que sero escritos pela funo printf(). Cada tipo de sada precedido por um sinal de%, e um tipo de sada deve ser especificado para cada varivel a ser escrita. Assim, sequissssemos escrever uma nica expresso com o comando printf(), faramos
Se fossem duas as expresses a serem escritas, faramos
e assim por diante. Note que os formatos e as expresses a serem escritas com aqueleformato devem ser especificados na mesma ordem, como mostram as setas. Alm dis-so, as variveis e/ou expresso devem ser separadas por vrgulas.
O comando printf()no exige o smbolo & na frente do nome de cada varivel.
Diferentemente do comando scanf(), o comando printf()no exige o smbolo &na frente do nome de uma varivel que ser escrita na tela. Se usado, ele possui outrosignificado (como ser visto mais adiante) e no exibe o contedo da varivel.
A funo printf()pode ser usada para escrever praticamente qualquer tipo de dado.A Tabela 2.3 mostra alguns dos tipos de sada suportados pela linguagem.
Alguns tipos de sada
%c escrita de um caractere (char)
%d ou %i escrita de nmeros inteiros (int ou char)
%u escrita de nmeros inteiros sem sinal (unsigned)
%f escrita de nmero reais (float ou double)
%s escrita de vrios caracteres
%p escrita de um endereo de memria
%e ou %E escrita em notao cientfica
TA BELA 2.3
Na Figura 2.6, tem-se alguns exemplos de escrita de dados utilizando o comando
printf(). Nesse momento no se preocupe com o \n que aparece dentro do comandoprintf(), pois ele serve apenas para ir para uma nova linha ao final do comando.
-
5/20/2018 Linguagem c Completa e Descomp
42/367
Lendo e escrevendo nas variveis 37
Exemplo: escrita de dados na linguagem C
01
02
03
0405
06
07
08
09
10
11
12
13
14
#include
#include
int main(){
int x = 10;//Escrita de um valor inteiro
printf(%d\n,x);
float y = 5.0;//Escrita de um valor inteiro e outro real
printf(%d%f\n,x,y);
//Adicionando espao entre os valores
printf(%d %f\n,x,y);
system(pause);
return0;
}
Sada 10
105.00000010 5.000000
FIGURA 2.6
Nesse exemplo, os comandos
printf(%d%f\n,x,y);
eprintf(%d %f\n,x,y);
imprimem os mesmos dados, mas o segundo os separa com um espao. Isso ocorreporque o comando printf()aceita textos junto aos tipos de sada. Pode-se adicionartexto antes, depois ou entre dois ou mais tipos de sada:
Junto ao tipo de sada, pode-se adicionar texto e no apenas espaos.
01
02
03
04
05
06
07
08
09
10
#include
#include
int main(){
int x = 10;
printf(Total = %d\n,x);
printf(%d caixas\n,x);
printf(Total de %d caixas\n,x);
system(pause);
return0;}
Sada Total = 10
10 caixasTotal de 10 caixas
-
5/20/2018 Linguagem c Completa e Descomp
43/367
38 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
Isso permite que o comando printf()seja usado para escrever no apenas dados,mas sentenas que faam sentido para o usurio do programa.
2.2.2 Putchar
A funo putchar() (put character) permite escrever um nico caractere na tela. Suaforma geral :
int putchar(int caractere)
A funo putchar() recebe como parmetro de entrada um nico valor inteiro.Esse valor ser convertido em caractere e mostrado na tela. A funo retorna:
Se NO ocorrer erro: o prprio caractere que foi escrito.
Se ocorrer erro: a constante EOF(definida na biblioteca stdio.h) retornada.
Exemplo: putchar()
01
02
03
04
05
06
07
08
0910
11
12
#include
#include
int main(){
char c = a;
int x = 65;
putchar(c);//Escreve o caractere a
putchar(\n);//Muda de linha
putchar(x);//Escreve o valor 65 como caractere
putchar(\n);//Muda de linha system(pause);
return 0;
}
Sada a
A
FIGURA 2.7
Perceba, no exemplo anterior, que a converso na linguagem C direta no momen-to da impresso, ou seja, o valor 65 convertido no caractere ASCII correspondente,no caso, o caractere a. Alm disso, o comando putchar() tambm aceita o uso desequncias de escape, como o caractere \n (nova linha).
2.3 LENDO SUAS VARIVEIS DO TECLADO
2.3.1 Scanf
A funo scanf() uma das funes de entrada/leitura de dados da linguagem C. Seunome vem da expresso em ingls scan formatted, ou seja, leitura formatada. Basicamen-te, a funo scanf()l do teclado um conjunto de valores, caracteres e/ou sequncia de
caracteres de acordo com o formato especificado. A forma geral da funo scanf():scanf(tipos de entrada, lista de variveis)
-
5/20/2018 Linguagem c Completa e Descomp
44/367
Lendo e escrevendo nas variveis 39
A funo scanf()recebe dois parmetros de entrada:
tipos de entrada : conjunto de caracteres que especifica o formato dos dadosa serem lidos.
lista de variveis : conjunto de nomes de variveis que sero lidos e separadospor vrgula, em que cada nome de varivel precedido pelo operador &.
Os tipo de entradaespecificam o formato de entrada dos dados que sero lidospela funo scanf(). Cada tipo de entrada precedido por um sinal de %, e um tipode entrada deve ser especificado para cada varivel a ser lida. Assim, se quisssemos leruma nica varivel com o comando scanf(), faramos:
Se fossem duas as variveis a serem lidas, faramos:
e assim por diante. Note que os formatos e as variveis que armazenaro o dado comaquele formato devem ser especificados na mesma ordem, como mostram as setas.
Alm disso, as variveis devem ser separadas por vrgulas.
Na linguagem C, necessrio colocar o smbolo & antes do nome de cada varivel a ser
lida pelo comando scanf().
Trata-se de uma exigncia da linguagem C. Todas as variveis que recebero valoresdo teclado por meio de scanf()devero ser passadas pelos seus endereos. Isso se fazcolocando o operador de endereo & antes do nome da varivel.
A funo scanf()pode ser usada para ler praticamente qualquer tipo de dado. Noentanto, ela usada com mais frequncia para a leitura de nmeros inteiros e/ou deponto flutuante (nmeros reais). A Tabela 2.4 mostra alguns dos tipos de sada supor-
tados pela linguagem.
Alguns tipos de sada
%c leitura de um caractere (char)
%d ou %i leitura de nmeros inteiros (int ou char)
%f leitura de nmero reais (float ou double)
%s leitura de vrios caracteres
TA BELA 2.4
Na Figura 2.8, tem-se alguns exemplos de leitura de dados utilizando o comandoscanf().
-
5/20/2018 Linguagem c Completa e Descomp
45/367
40 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
Exemplo: leitura de dados na linguagem C
01
02
03
0405
06
07
08
09
10
11
12
13
14
15
1617
18
#include
#include
int main(){
int x,z;float y;
//Leitura de um valor inteiro
scanf(%d,&x);
//Leitura de um valor real
scanf(%f,&y);
//Leitura de um valor inteiro e outro real
scanf(%d%f,&x,&y);
//Leitura de dois valores inteiros
scanf(%d%d,&x,&z);
//Leitura de dois valores inteiros com espaco
scanf(%d %d,&x,&z);
system(pause); return0;
}
FIGURA 2.8
Nesse exemplo, os comandos
scanf(%d%d,&x,&z);
escanf(%d %d,&x,&z);
so equivalentes. Isso ocorre porque o comando scanf()ignora os espaos em brancoentre os tipos de entrada. Alm disso, quando o comando scanf() usado para ler doisou mais valores, podemos optar por duas formas de digitar os dados no teclado:
Digitar um valor e, em seguida, pressionar a tecla ENTER. Fazer isso para cadavalor a ser digitado.Digitar todos os valores separados por espao e, por ltimo, pressionar a teclaENTER.
O comando scanf()ignora apenas os espaos em branco entre os tipos de entrada.
Qualquer outro caractere inserido entre os tipos de dados dever ser digitado pelo
usurio, mas ser descartado pelo programa.
01
02
03
04
05
06
07
08
09
10
#include
#include
int main(){
int dia, mes, ano;
//Leitura de tres valores inteiros
//com barras entre eles
scanf(%d/%d/%d,&dia,&mes,&ano);
system(pause);
return0;
}
-
5/20/2018 Linguagem c Completa e Descomp
46/367
Lendo e escrevendo nas variveis 41
Isso permite que o comando scanf() seja usado para receber dados formatadoscomo uma data: dia/ms/ano. No exemplo anterior, o comando scanf() usado para aentrada de trs valores inteiros separados por uma barra (/) cada. Quando o usuriofor digitar os trs valores, ser obrigado a digitar os trs valores separados por barra (asbarras sero descartadas e no interferem nos dados). Do contrrio, o comando scanf()no ler corretamente os dados digitados.
2.3.2 Getchar
A funo getchar()(get character) permite ler um nico caractere do teclado. Suaforma geral :
int putchar(void)
A funo getchar()no recebe parmetros de entrada. A funo retorna:
Se NO ocorrer erro: o cdigo ASCII do caractere lido.Se ocorrer erro: a constante EOF(definida na biblioteca stdio.h) retornada.
Exemplo: getchar()
01
02
03
0405
06
07
08
09
10
#include
#include
int main(){
char c; c = getchar();
printf(Caractere: %c\n, c);
printf(Codigo ASCII: %d\n, c);
system(pause);
return0;
}
FIGURA 2.9
Perceba, nesse exemplo, que a converso na linguagem C direta no momento daleitura, ou seja, embora a funo retorne um valor do tipo int, pode-se atribuir a uma
varivel do tipo char devido converso automtica da linguagem C.
2.4 ESCOPO: O TEMPO DE VIDA DA VARIVEL
Quando declaramos uma varivel, vimos que preciso sempre definir o seu tipo(conjunto de valores e de operaes que uma varivel aceita) e nome (como o pro-gramador identifica essa varivel dentro do programa). Porm, alm disso, precisodefinir o seu escopo.
O escopo o conjunto de regras que determinam o uso e a validade das variveis aolongo do programa.
-
5/20/2018 Linguagem c Completa e Descomp
47/367
42 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
Em outras palavras, escopo de uma varivel define ondee quandoa varivel podeser usada. Esse escopo est intimamente ligado ao local de declarao dessa varivel e,por esse motivo, pode ser globalou local.
2.4.1 O escopo global
Uma varivel declarada no escopo global, ou simplesmentevarivel global, umavarivel declarada fora de todas as funes do programa, ou seja, na rea de declara-es globais do programa (acima da clusula main, juntamente com as bibliotecas doprograma). Essas variveis existem enquanto o programa estiver executando, ou seja, otempo de vida de uma varivel global o tempo de execuo do programa. Alm disso,essas variveis podem ser acessadas e alteradas em qualquer parte do programa.
Variveis globais podem ser acessadas e alteradas em qualquer parte do programa.
01
02
03
04
05
06
07
08
09
1011
12
13
#include
#include
int x = 5;//varivel global
voidincr(){
x++;//acesso a variavel global
}
int main(){ printf(x = %d\n,x);//acesso a variavel global
incr();
printf(x = %d\n,x);//acesso a varivel global system(pause);
return0;
}
Sada 5
6
Na Figura 2.10, possvel ter uma boa representao de onde comea e terminacada escopo do cdigo anterior.
FIGURA 2.10
-
5/20/2018 Linguagem c Completa e Descomp
48/367
Lendo e escrevendo nas variveis 43
Note, no exemplo anterior, que a varivelx declarada junto com as bibliotecas doprograma; portanto, trata-se de uma varivel global (escopo global). Por esse motivo,ela pode ser acessada e ter seu valor alterado em qualquer parte do programa (ou seja,no escopo global e em qualquer escopo local que exista dentro do programa).
De modo geral, evita-se o uso de variveis globais em um programa.
As variveis globais devem ser evitadas porque qualquer parte do programa pode alte-r-la. Isso prejudica a manuteno do programa, pois torna mais difcil saber onde a va-rivel inicializada, para que serve etc. Alm disso, as variveis globais ocupam memriadurante todo o tempo de execuo do programa e no apenas quando so necessrias.
2.4.2 O escopo local
Uma varivel declarada no escopo local, ou simplesmentevarivel local, uma va-rivel declarada dentro de um bloco de comandos delimitado pelo operador de chaves({ }, escopo local). Essas variveis so visveis apenas no interior do bloco de comandosonde foram declaradas, ou seja, apenas dentro do seu escopo.
Um bloco comea quando abrimos uma chave ({) e termina quando fechamos a
chave (}).
01
02
03
04
05
06
07
08
09
10
11
12
1314
15
16
17
18
#include
#include
voidfunc1(){ int x;//variavel local
}
voidfunc2(){ int x;//variavel local
}
int main(){
int x; scanf(%d,&x);
if(x == 5){
int y=1; printf(%d\n,y);
}
system(pause);
return0;
}
Note, nesse exemplo, que a varivelx declarada trsvezes. Cada declarao delaest em um bloco de comandos distinto (ou seja, delimitado por um operador dechaves ({ }). Desse modo, apesar de possurem o mesmo nome, elas possuem escoposdiferentes e, consequentemente, tempos de vida diferentes: uma no existe enquantoa outra existe. J a varivel ys existe dentro do bloco de comandos pertencente instruo if(x == 5), ou seja, outro escopo local.
-
5/20/2018 Linguagem c Completa e Descomp
49/367
44 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
Na Figura 2.11, possvel ter uma boa representao de onde comea e terminacada escopo do cdigo anterior.
FIGURA 2.11
Quando um bloco possuir uma varivel local com o mesmo nome de uma varivel
global, esse bloco dar preferncia varivel local. O mesmo vale para duas variveis
locais em blocos diferentes: a declarao mais prxima sempre tem maior precedncia
e oculta as demais variveis com o mesmo nome.
Note, no exemplo anterior, que a varivelx declarada trsvezes. Cada declara-o dela est em um escopo distinto: uma global e duas so locais. Na primeirachamada do comando printf()(linha 5), a varivel globalx acessada. Isso ocorreporque, apesar de estarmos em um escopo local, a segunda varivelxainda no foicriada e, portanto, no existe. J na segunda chamada do comando printf()(linha7), a segunda varivel xj foi criada, ocultando a varivel global de mesmo nome.Por isso, esse comando printf()imprime na tela de sada o valor x = 4. O mesmo
acontece com a terceira chamada do comando printf()(linha 10): esse comando estdentro de um novo bloco de comandos, ou seja, delimitado por um operador de cha-ves ({ }). A declarao da terceira varivelxoculta a declarao da segunda varivelx.Por isso, esse comando printf()imprime na tela de sada o valor x = 3. No fim dessebloco de comandos, a terceira varivelx destruda, o que torna novamente visvela segunda varivel x, a qual impressa na tela pela quarta chamada do comandoprintf()(linha 12).
Na Figura 2.12, possvel ter uma boa representao de onde comea e terminacada escopo do cdigo anterior e como um escopo oculta os demais.
-
5/20/2018 Linguagem c Completa e Descomp
50/367
Lendo e escrevendo nas variveis 45
FIGURA 2.12
Como o escopo um assunto delicado e pode gerar muita confuso, evita-se o uso de
variveis com o mesmo nome.
2.5 CONSTANTES
Aprendemos que uma varivel uma posio de memria onde podemos guardardeterminado dado ou valor e modific-lo ao longo da execuo do programa. J uma
constantepermite guardar determinado dado ou valor na memria do computador,mas com a certeza de que ele no se alterar durante a execuo do programa: sersempre o mesmo; portanto, constante.
Para constantes, obrigatria a atribuio do valor no momento da declarao.
Isso ocorre porque, aps a declarao de uma constante, seu valor no poder maisser alterado: ser constante. Na linguagem C existem duas maneiras de criar constan-tes: usando os comandos #definee const. Alm disso, a prpria linguagem C possuialgumas constantes predefinidas, como as sequncias de escape.
2.5.1 Valor literal
Um valor literal a representao de um dado dentro do prprio cdigo-fonte.Trata-se de um valor que expresso como ele mesmo e no como um valor armazena-do em varivel ou o resultado de uma expresso aritmtica. Na declarao a seguir, 10 um valor literal:
int n = 10;
-
5/20/2018 Linguagem c Completa e Descomp
51/367
46 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
Um valor literal, assim como as variveis, pertence a determinado tipo de dado. Porexemplo, o valor 10.5 considerado do tipo double, apesar de a linguagem possuirtrs tipos para pontos flutuantes: float, doublee long double. Felizmente, a lingua-gem C permite que indiquemos o tipo de um valor literal pela adio de um sufixo.
O sufixo de tipo nada mais do que um caractere de tipo acrescentado ao final do valor
literal, sem nenhum espao entre eles. Eles so teis para forar o resultado de uma
expresso para uma preciso particular.
A Tabela 2.5 apresenta os sufixos de tipo possveis.
Sufixo Tipo Exemplo
sem sufixo double 10.5
int 10
f ou F float 3.14F
l ou L long double 123456.789L
long int 123456799L
u ou U unsigned int 453U
ul ou UL unsigned long int 123456789UL
TA BELA 2.5
2.5.2 O comando#define
Uma das maneiras de declarar uma constante usando o comando #define, quesegue a seguinte forma geral:
#definenome_da_constante valor_da_constante
O comando #define uma diretiva de compilao que informa ao compilador que ele
deve procurar todas as ocorrncias da palavra definida por nome_da_constantee substituirporvalor_da_constantequando o programa for compilado. Por exemplo, uma constanteque represente o valor de pode ser declarada como apresentado a seguir:
#definePI 3.1415
2.5.3 O comando const
Uma outra maneira de declarar uma constante usando o comando const, quesegue esta forma geral:
consttipo_da_constantenome_da_constante = valor_da_constante;
-
5/20/2018 Linguagem c Completa e Descomp
52/367
Lendo e escrevendo nas variveis 47
Note que a forma geral do comando constse parece muito com a da declarao deuma varivel. Na verdade, o prefixo constapenas informa ao programa que a variveldeclarada no poder ter seu valor alterado. Por ser uma varivel, essa constante estsujeita s mesmas regras que regem o uso das variveis. Por exemplo, uma constanteque represente o valor de pode ser declarada como apresentado a seguir:
const float PI = 3.1415;
2.5.4 As sequncias de escape
A linguagem C possui algumas constantes predefinidas, como as sequncias deescapeou cdigos de barra invertida. As sequncias de escape permitem o envio decaracteres de controle no grficos para dispositivos de sada.
A Tabela 2.6 apresenta uma relao das sequncias de escape mais utilizadas emprogramao e seu significado.
Cdigo Comando
\a som de alerta (bip)
\b retrocesso (backspace)
\n nova linha (new line)
\r retorno de carro (carriage return)
\v tabulao vertical
\t tabulao horizontal
\ apstrofe
\ aspa
\\ barra invertida (backslash)
\f alimentao de folha (form feed)
\? smbolo de interrogao
\0 caractere nulo (cancela a escrita do restante)
TA BELA 2.6
As sequncias de escape permitem que o comando printf()imprima caracteres especiaisna tela de sada, como tabulaes e quebras de linha. Veja o exemplo da Figura 2.13.
-
5/20/2018 Linguagem c Completa e Descomp
53/367
48 L I N GUAGE M C CO M PL E T A E DE S CO M PL I CADA
Exemplo: sequncias de escape
01
02
03
0405
06
07
08
09
10
#include
#include
int main(){
printf(Hello World\n);
printf(Hello\nWorld\n);
printf(Hello World\n);
printf(\Hello World\\n);
system(pause);
return0;
}
Sada Hello World
Hello
World
Hello \ World
Hello World
FIGURA 2.13
2.6 EXERCCIOS
1) Elabore um programa que escreva as mensagens Incio do programa e Fim natela, uma em cada linha, usando apenas um comando printf().
2) Escreva um programa que leia um nmero inteiro e depois o imprima.
3) Escreva um programa que leia um nmero inteiro e depois imprima a mensagemValor lido:, seguido do valor inteiro. Use apenas um comando printf().
4) Faa um programa que leia um nmero inteiro e depois o imprima usando o ope-rador %f. Veja o que aconteceu.
5) Faa um programa que leia um valor do tipo float e depois o imprima usando ooperador %d. Veja o que aconteceu.
6) Faa um programa que leia um valor do tipo double e depois o imprima na forma
de notao cientfica.
7) Elabore um programa que leia um caractere e depois o imprima como um valorinteiro.
8) Faa um programa que leia dois nmeros inteiros e depois os imprima na ordeminversa em que eles foram lidos.
9) Faa um programa que leia dois valores do tipo float. Use um nico comando deleitura para isso. Em seguida, imprima os valores lidos na ordem inversa em que eles
foram lidos.
-
5/20/2018 Linguagem c Completa e Descomp
54/367
Lendo e escrevendo nas variveis 49
10) Elabore um programa que solicite ao usurio entrar com o valor do dia, ms e ano(inteiros). Em seguida, imprima os valores lidos separados por uma barra (\).
11) Elabore um programa que contenha uma constante qualquer do tipo float. Use o
comando #define. Imprima essa constante.12) Elabore um programa que contenha uma constante qualquer do tipo int. Use o
comando const. Imprima essa constante.
13) Faa um programa que leia um caractere do tipo char e depois o imprima entreaspas duplas. Assim, se o caractere lido for a letra A, dever ser impresso A.
14) Faa um programa que leia trs caracteres do tipo chare depois os imprima umem cada linha. Use um nico comando printf()para isso.
15) Escreva um programa que leia trs variveis: char, inte float. Em seguida, imprima-as de trs maneiras diferentes: separadas por espaos, por uma tabulao horizontal euma em cada linha. Use um nico comando printf()para cada operao de escritadas trs variveis.
-
5/20/2018 Linguagem c Completa e Descomp
55/367
C A P T U L O 3
As operaes que podemosfazer com as variveis
Afinalidade deste captulo apresentar ao leitor as operaes que podemos reali-zar com nossas variveis na linguagem C. Ao final, o leitor ser capaz de:
Definir o valor contido em uma varivel.Realizar operaes matemticas com suas variveis.Realizar operaes de comparao entre suas variveis.Realizar operaes lgicas entre suas variveis.
Realizar operaes em nvel de bits com suas variveis.Conhecer as operaes simplificadas.Saber a ordem em que as operaes so realizadas.
3.1 O OPERADOR DE ATRIBUIO =
Uma das operaes mais utilizadas em programao a operao de atribuio =.Ela responsvel por armazenar determinado valor em uma varivel. Em linguagemC, o uso do operador de atribuio = segue esta forma geral:
nome_da_varivel = expresso;
Por expresso entende-se qualquer combinao de valores,variveis, constantesou chamadas de funesutilizando os operadores matemticos +, , *, / e %, queresulte em uma resposta do mesmo tipo da varivel definida por nome_da_varivel.Veja o exemplo da Figura 3.1.
-
5/20/2018 Linguagem c Completa e Descomp
56/367
52 L I N GUA GE M C CO M PL E T A E D E S CO M PL I CA D A
Exemplo: operaes de atribuio
010203
04050607
08091011
12131415
16
171819
202122
2324
#include #include #include
const int z = 9;int main(){ float x; //declara y e atribui um valor float y = 3; //atribui um valor a x
x = 5; printf(x = %f\n,x); //atribui uma constante a x
x = z; printf(x = %f\n,x); //atribui o resultado de uma //expressao matematica a x
x = y + 5; printf(x = %f\n,x); //atribui o resultado de uma funcao a x x = sqrt(9);
printf(x = %f\n,x); system(pause); return0;}
Sada x = 5.000000x = 9.000000x = 8.000000x = 3.000000
F IG U RA 3 . 1
Nesse exemplo, nota-se que o operador de atribuio tambm pode ser utilizadono momento da declarao da varivel (linha 8). Desse modo, a varivel j declaradapossuindo um valor inicial.
O operador de atribuio = armazena o valor ou resultado de uma expresso contida
sua direitana varivel especificada sua esquerda.
0102
0304050607
08091011
121314
15161718
#include #include
#include const int z = 9;int main(){ float x;float y = 3;
//Correto x = y + 5; //ERRADO y + 5 = x;
//Correto x = 5; //ERRADO 5 = x;
system(pause); return0;}
-
5/20/2018 Linguagem c Completa e Descomp
57/367
As operaes que podemos fazer com as variveis 53
importante ter sempre em mente que o operador de atribuio = calcula a expresso direita do operador = e atribui esse valor varivel esquerda do operador, nunca ocontrrio.
A linguagem C suporta mltiplas atribuies.
01
02030405
06070809
10
11
#include #include int main(){ float x, y, z;x = y = z = 5;
printf(x = %f\n,x); printf(y = %f\n,y); printf(z = %f\n,z);
system(pause); return0;
}
Sada x = 5.000000y = 5.000000
z = 5.000000
Nesse exemplo, o valor 5 copiado para a varivel z. Lembre-se: o valor da direita sempre armazenado na varivel especificada sua esquerda. Em seguida, o valor de z copiado para a varivelye, na sequncia, o valor dey copiado parax.
A linguagem C tambm permite a atribuio entre tipos bsicos diferentes. O com-pilador converteautomaticamente o va