linguagem c completa e descomp

367

Upload: batalha-helio

Post on 10-Oct-2015

450 views

Category:

Documents


3 download

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

    [email protected]

    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