125
C: "A" Linguagem de Programação [ Versão Integral ] Publicado originalmente em OLinux - http://www.olinux.com.br Créditos: Elias Bareinboim - [[email protected]] – Aulas: 1-9, 13, 17, 19, 20, e 25; André Duarte de Souza - [[email protected]] – Aulas: 10-12, 14, 22, 40-42; Paulo Henrique Baptista de Oliveira - [[email protected]] – Aula: 15; Diego Lages - [[email protected]] – Aula: 16; Rodrigo Hausen - [[email protected]] – Aulas: 18, 21, 23, 24, 26, 28-31, e 37; Rodrigo Fonseca - [[email protected]] – Aula: 27; Gerson Garcia dos Santos – [[email protected]] – Aulas: 38 e 39. Edição: Davi Tavares Ferreira - [email protected] Cristian Privat – [email protected] Copyright (c) 2000 Linux Solutions. "Permissão para cópia, distribuição e/ou modificação deste documento sob os termos da GNU Free Documentation License , versão 1.1, ou qualquer versão futuramente publicada pela Free Software Foundation; com os títulos das seções sendo MANTIDOS e textos da capa e créditos sendo LISTADOS." Page 1 of 125 Curso de C - Olinux 8/10/2010 http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

Linguagem C.pdf

Embed Size (px)

DESCRIPTION

programação em linguagem C

Citation preview

  • C: "A" Linguagem de Programao

    [ Verso Integral ]

    Publicado originalmente em OLinux - http://www.olinux.com.br

    Crditos:

    Elias Bareinboim - [[email protected]] Aulas: 1-9, 13, 17, 19, 20, e 25; Andr Duarte de Souza - [[email protected]] Aulas: 10-12, 14, 22, 40-42; Paulo Henrique Baptista de Oliveira - [[email protected]] Aula: 15; Diego Lages - [[email protected]] Aula: 16; Rodrigo Hausen - [[email protected]] Aulas: 18, 21, 23, 24, 26, 28-31, e 37; Rodrigo Fonseca - [[email protected]] Aula: 27; Gerson Garcia dos Santos [[email protected]] Aulas: 38 e 39.

    Edio:

    Davi Tavares Ferreira - [email protected] Cristian Privat [email protected]

    Copyright (c) 2000 Linux Solutions.

    "Permisso para cpia, distribuio e/ou modificao deste documento sob os termos da GNU Free Documentation License, verso 1.1, ou qualquer verso futuramente publicada pela Free Software Foundation; com os ttulos das sees sendo MANTIDOS e textos da capa e crditos

    sendo LISTADOS."

    Page 1 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Aula 1Introduo:

    Estamos comeando uma seo de programao do nosso site e daqui para frente regularmente sero colocados artigos e tutoriais de temas relacionados a programao para o ambiente Linux (UNIX) neste espao.

    Com o intuito de uma introduo terica a tal ambiente, utilizaremos a linguagem C, a linguagem de programao mais utilizada no mundo. Vrios de nossos artigos tem base em outros artigos/sites (a maioria do exterior, seno todos) como fonte de pesquisa. Procure por estes na rea de links, sempre estaro disponveis e sero muito teis.

    No espante-se com alguns termos e vrios conceitos novos, o ato de programar mais fcil do que parece, no se assuste, com um pouco de leitura e tempo para praticar voc pode tornar-se um bom programador C.

    "Programar o ato de pensar utilizando-se algumas padronizaes (pr-definies). Aqui tentaremos direcionar como voc deve canalizar seus pensamentos para resolver os problemas propostos e lhes colocaremos a frente das padronizaes da linguagem C".

    Programar s isso, resolver problemas da vida real de forma "entendvel" ao computador. Mostrar-lhe como voc fez em uma linguagem que ele entenda.

    Um bom programador C, o que voc tende a ser tornar, algo que est em falta no mercado. Se tem a idia que o mercado de programao est saturado e tem programadores saindo pelas janelas. No verdade. O que no falta por a na verdade so programadores de "linguagens" visuais e programas populares de propsito superficial e de rpida implementao que no servem para o "trabalho pesado", est rea sim, est saturada.

    Irremediavelmente, quando uma empresa precisa fazer um programa "pesado" (algo robusto e flexvel ao mesmo tempo, bem modelado e que utilize toda potencialidade possvel de sua mquina) ela tem que utilizar o C, e a falta programadores desta rea notria. uma mo de obra muito escassa e que cada vez mais ganha destaque e valor no mercado.

    Ns prximos artigos tambm ensinaremos programao visual, front-end grfico que faz o programa parecer mais amigvel, mas isso casca, perfumaria ... na verdade no importa muito. O importante realmente so os conceitos, o que est acontecendo por trs, como as coisas funcionam e justamente isso que ser nosso enfoque.

    Histrico do C:

    Em 1973, Dennis Ritchie, pesquisador da Bell Labs rescreveu todo sistema UNIX para uma linguagem de alto nvel (na poca considerada) chamada C (desenvolvida por ele), para um PDP-11 (o microcomputador mais popular na poca). Tal

    Page 2 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • situao de se ter um sistema escrito em linguagem de alto nvel foi mpar e pode ter sido um dos motivos da aceitao do sistema por parte dos usurios externos a Bell e sua popularizao tem relao direta com o exponencial uso do C.

    Por vrios anos o padro utilizado para o C foi o que era fornecido com o UNIX verso 5 (descrito em The C programming Language, de Brian Kernighan e Dennis Ritchie - 1978. Se voc est interessado em saber mais, v para a introduo). Comearam a surgir diversos diversas implementaes da tal linguagem e os cdigos gerados por tais implementaes era altamente incompatveis. No existia nada que formalizasse essas compatibilizaes e com o aumento do uso das diversas "vertentes" da linguagem surgiu a necessidade de uma padronizao, algo que todos devessem seguir para poderem rodar seus programas em todos os lugares que quisessem.

    O ANSI (American National Standards Intitute, Instituto Americano que at hoje dita diversos padres) estabeleceu em 1983 um comit responsvel pela padronizao da linguagem. Atualmente, a grande maioria dos compiladores j suportam essa padronizao.

    Trocando em midos, o C pode ser escrito em qualquer mquina que se utilize de tal padro e rodar em qualquer outra que tambm o faa. Parece intil? No, na verdade isso a semente de grande parte dos avanos tecnolgicos que toda programao nos tem proporcionado no mundo de hoje. Com o tempo isso ficar mais claro.

    Caractersticas da Linguagem C:

    1. C uma linguagem que alia caractersticas de linguagens de alto nvel (como pascal, basic) e outras de baixo nvel como assembly. O que isso quer dizer? Que C junta flexibilidade, praticidade e poder de manipulao da mquina diretamente e, por isso, no traz as limitaes dessas linguagens, como dificuldade de uso, limitaes na operao, etc. C permite liberdade total ao programador e este responsvel por tudo que acontece, nada imposto ou acontece simplesmente ao acaso, tudo pensado pelo programador e isso significa um bom controle e objetividade em suas tarefas, o que no conseguido em outras linguagens que pecam em alguma coisa.

    C uma linguagem que podemos chamar de estruturada. No queremos nos ater muito a nomenclaturas, mas ling. estruturadas so linguagens que estruturam o programa em blocos para resolver os problemas. A filosofia bsica de uma linguagem estruturada dividir para trabalhar, voc divide um problema em pequenas partes que sejam possveis de serem feitas. Por exemplo, temos um problema grande que impossvel de se resolver sozinho, dividimos este problema em pequenas partes simples que se integrando os pedacinhos acabam resolvendo o problema maior complexo.

    2. Outra coisa atrelada a essa idia bsica de dividir para trabalhar que as divises sejam feitas de modo que os mdulos sejam independentes ao mximo do contexto onde se est inserido.

    O que isso quer dizer? Que os mdulos tem que ter um carter geral, independente, para que futuramente possa ser encaixado em outro problema que possa necessitar da tarefa que esse mdulo realiza. Voc precisa apenas saber o que a rotina faz e no como ela faz, isso pode ser til para compartilhar cdigo. Imagine que daqui a 1 ano, voc tenha diversas funes desenvolvidas e deseje criar um programa com algumas similaridades do que voc j criou. Simples, basta pegar as funes que voc nem lembra mais como funcionam mas sabe o que elas fazem e encaixar no lugar certo do seu novo programa, economizar muito cdigo e tempo.

    Vamos a um exemplo, tem-se um problema de matemtica de arranjo ou combinao (probabilidade? matemtica combinatria?) Tambm no sou muito bom nisso:) e precisa-se calcular a fatorial de determinado nmero. Uma vez feita a funo de fatorial, no importa como ela trabalha. O que me interessa s passar como para metro para esta funo o nmero que eu quero ter o seu fatorial calculado e receber o resultado pronto. Voc s se preocupou uma vez em saber como funciona tal funo para cri-la.

    Outra situao, imagine voc trabalhando em um grande projeto e seu trabalho ser parte de um problema maior. Voc sabe o que tem, o que recebido pelo seu mdulo, o que ele deve trabalhar e qual sada deve gerar. S com essas informaes deve-se fazer o trabalho e futuramente entregar a algum que no sabe como ele funciona e sim apenas as especificaes pedidas. Ele simplesmente far a insero no contexto do programa. Note, nem voc sabe o que o programa todo faz ou como funciona. Nem o responsvel por juntar sabe como o seu programa funciona por dentro e sim apenas o que ele faz e onde deve ser inserido. Isso bastante comum para quem trabalha com programao.

    Compilada ou Interpretada:

    Page 3 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • C uma linguagem compilada, utiliza de um compilador C para ser executado. Ao contrrio de outras linguagens que utilizam de um interpretador para tal. Na concepo da linguagem que se decide se ela vai ser compilada ou interpretada,

    pois um detalhe de implementao (que no deixa de ser importante). A priori qualquer uma poderia ser interpretada ou compilada.

    Na verdade, quem faz um programa ser executado tambm um programa, s que um programa avanado que l todo cdigo fonte (o que foi escrito pelo programador) e o traduz de alguma forma para ser executado, isso acontece em todas linguagens.

    A diferena bsica que um interpretador l linha a linha do fonte, o examina sintaticamente e o executa. Cada vez que o programa for executado esse processo tem de ser repetido e o interpretador chamado. J um compilador, l todo programa e o converte para cdigo-objeto (cdigo de mquina, binrio, 0's e 1's) e pronto. Sempre quando tiver que ser executado s cham-lo, todas instrues j esto prontas para tal, no tem mais vnculo com seu cdigo-fonte.

    Bem pessoal, muitos conceitos novos j foram dados por hoje, tempo para reflexo !:)

    Espero que tenham gostado. Aguardo seus comentrios e sua participao nos nossos fruns!

    Aula 2O compilador:

    Terminamos a coluna da semana passada falando de compiladores, espero que tenham gostado.

    Faamos uma reviso rpida:

    Usar um compilador, uma linguagem compilada no o mesmo que usar uma linguagem interpretada, como Perl. Existem diferenas na forma de execuo. Porm, a implementao opo de quem criou a linguagem.

    Um programa em C elaborado em dois passos bsicos:

    O programa escrito em texto puro num editor de texto simples. Tal programa se chama "cdigo fonte" (source code em ingls).

    Passamos o cdigo fonte para o compilador que o programa que gera um arquivo num formato que a mquina entenda.

    O compilador trabalha, em geral, em duas fases bsicas:

    1. O compilador gera, atravs do cdigo fonte, um cdigo intermedirio que ajuda a simplificar a "gramtica" da linguagem. Como o processamento subsequente agir: um arquivo "objeto" ser criado para cada cdigo fonte.

    2. Depois, o linkador junta o arquivo objeto com a biblioteca padro. A tarefa de juntar todas as funes do programa bastante complexa. Nesse estgio, o compilador pode falhar se ele no encontrar referncias para a funo.

    Para evitar a digitao de 2 ou 3 comandos voc pode tentar:

    Page 4 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • $ gcc fonte.c

    ou

    $ cc fonte.c

    que evitar esse inconveniente.

    Na maioria dos computadores, isso gerar um arquivo chamado "a.out", para evitar isso voc pode utilizar a opo -o, assim fica:

    gcc -o destino fonte.c

    O seu programa se chamar destino e ser o derivado do fonte chamado fonte.c.

    Erros:

    Erros so provocados sempre pelo programador. Existem basicamente dois tipos de erros:

    Lgico

    Sintaxe

    Os erros de sintaxe so os melhores que podem acontecer. Voc capaz de identific-lo durante a compilao do programa. Ou seja, no existe um efeito desagradvel na execuo do programa, ele no pode fazer algo que seja impossvel ou no determinado previamente na linguagem (==gramtica).

    Em geral, quando os compiladores encontram um erro no terminam imediatamente, mas continuam procurando e ao final do programa mostram indicativamente onde os erros se encontram e do que se tratam. a mesma coisa que uma correo ortogrfica, voc nunca pode falar nada errado ortograficamente nem gramaticalmente, o compilador no deixa.

    bastante traumatizante para algum, fazendo seu primeiro programa, obter um erro e ver diversas linhas de erro e avisos "estranhos". No se assuste nem se desmotive, pode ser um simples ponto e vrgula ou um detalhe bobo. Com o tempo e a experincia voc comear a se acostumar e aprender a lidar com isso.

    Caso no tenha erros de escrita, o compilador transformar o seu cdigo fonte (texto puro) em cdigo de maquina (os tais 0's e 1's, o que a mquina entende) e voc poder executa-lo. Bem, e se a lgica do programa estiver errada? Este tipo de erro no pode ser detectado pelo compilador.

    como se voc falasse todas as coisas certas, desse todas as ordens entedveis para um empregado seu por exemplo porem com inconsistncia de dados.

    Exemplificando hipoteticamente:

    1. Voc pode falar com seu empregado e ele no entender o que voc est expressando e assim ele no conseguir executar a tarefa e reclamar. Por exemplo, falando em japons com ele! (erro sinttico)

    2. Voc explica tudo certo para o seu empregado, ele entende tudo porm a explicao inconsistente. Por exemplo, manda ele ir para uma rua que no existe ou comprar algo que no existe (erro de lgica).

    Tais erros podem acarretar algumas conseqncias graves:

    Que o programa termine repentinamente e s vezes avise alguma coisa

    Page 5 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Que o programa funcione incorretamente e gere dados inconsistentes

    Detalhes Importantes:

    Alguns detalhes interessantes a frisar para voc que est comeando a programar, por exemplo, caso voc tenha algum erro e conserte-o voc obrigado a compilar o programa novamente para que este tenha efeito, caso contrrio o executvel no reflitir o atual cdigo fonte, essa converso no automtica.

    Outro detalhe importante, o C, como tudo no mundo Linux/UNIX, difere letras maisculas e minsculas (case sensitive em ingls). Ou seja, voc tem que obedecer esse critrio e atentar-se a isso. O comum colocar tudo em minsculas, com exceo das strings que ficam a gosto do programador.

    Outra coisa importante, o C (como a maioria das linguagens atuais) exige que se faa uma listagem de todas as variveis do programa previamente. Ou seja, no existe uso dinmico de variveis e tudo que voc usa tem que ser previamente declarado.

    como na construo de um prdio, todo material (tijolos, cimento, madeira) tem que ser calculado e comprado antes pois na hora que voc precisa usar um tijolo, voc no fala, quero um tijolo e ele aparece na sua mo.

    Exerccio I:

    Bem, algumas perguntas bsicas que voc deveria responder depois a primeira e segunda coluna sobre C Bsico.

    1. A linguagem C alto ou baixo nvel? Qual a relao de C com outras linguagens de programao nesses termos?

    2. Qual a filosofia da linguagem estruturada? Qual a vantagem? Exemplifique.

    3. A linguagem C compilada ou interpretada? Qual diferena? Qual melhor?

    4. O que um compilador?

    5. Como um programa C roda?

    6. Como se compila um programa em C?

    7. As letras maisculas e minsculas so diferenciadas?

    8. Quais os tipos de erros que existem em C e qual o prefervel ?

    Bem, por enquanto s. At a prxima semana.

    Aula 3Palavras Reservadas:

    Fala moada! O que acharam da semana passada? No se preocupem se no entenderam alguns detalhes, e' s perguntar. Muitas das questes tratadas nas colunas passadas so tericas demais e demora um tempo para se acostumar. A programao em si mais fcil do que parece. Nesta coluna, trataremos de algumas coisas interessantes, entre elas as palavras reservadas do C.

    Page 6 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • O que vem a ser palavras reservadas? So palavras que tm significado especial na linguagem. Cada palavra quer dizer alguma coisa e em C as instrues so executadas atravs do uso de palavras chaves previamente determinadas que chamaremos de palavras reservadas. A priori, elas no podero ser usadas para outras coisas, alem do determinado para o C, mas entenderemos mais a fundo o que isso quer dizer com o tempo.

    Para o C conseguir trabalhar ficaria complicado distinguir quando uma dessas palavras especiais forem usadas como variveis ou com instrues. Por isso, foi determinado a no utilizao desta para outra coisa seno comando e afirmativas.

    Abaixo est a lista dessas palavras. Relembrando, o C entende, tais palavras apenas em letras minsculas (no funcionar se voc colocar em maisculas).

    auto, break, case, char, continue, default, do, double, else, entry, extern, float, for, goto, if, int, long, register, return, short, sizeof, static, struct, switch, typedef, union, unsigned, while, enum, void, const, signed, volatile.

    Todo conjunto de palavras reservadas acima so o conjunto das instrues bsicas do C. Aparentemente, parecem poucas e voc na prtica usar apenas algumas poucas delas. Tal fato acontece pois uma das facilidades do C a utilizao muito natural de bibliotecas que funcionam como acessrios para o C (como plugins do seu netscape). Tais bibliotecas (conjunto de funes) no fazem parte intrnseca do C, mas voc no encontrar nenhuma verso do C sem nenhuma delas. Algumas so at tratadas como parte da linguagem por serem padronizadas.

    Bibliotecas:

    Como dito anteriormente, funes so uma forma genrica de resolvermos problemas. como uma caixa preta, voc passa os dados para ela e recebe o resultado.

    Supondo que tenho uma funo de realizar soma, eu s me preocupo em passar para ela os nmeros que desejo ver somado e a funo se preocupa em me entregar o resultado, o que acontece l dentro problema dela.

    Atravs deste mtodo, dividimos os programas em pedaos de funcionalidades, genricos e pequenos de preferncia, com intuito de utiliza-lo futuramente em situaes que sejam convenientes.

    Assim como soma, pode-se fazer uma funo de subtrao, multiplicao, diviso e vrias outras e juntando-as se cria a tal famosa biblioteca.

    As bibliotecas em si podem ser utilizadas por vrios programas. Estes utilizam os subprogramas(funes!) desta mesma biblioteca tornando o programa gerado de menor tamanho, ou seja, o executvel s vai possuir as chamadas das funes da biblioteca e no o incluir no executvel.

    S para esclarecer, tenho uma biblioteca que desenha botes em janelas(GTK faz isso). Na hora que se for criar uma agenda, por exemplo, utilizo as funes desta biblioteca sem precisar rescrever estas mesmas funes neste programa.

    Em geral, utilizamos algumas funes j prontas para fazer determinadas tarefas que so consideradas bsicas. O programador no costuma fazer uma rotina que leia diretamente do teclado ou imprima na tela um caracter.

    Isso j existe e bem implementado (uma coisa interessante de se entender em programao , o que j existe de bem feito e pode ser utilizado deve ser utilizado). Seu sistema no ser menos digno ou pior se voc utilizar uma rotina que todo mundo utiliza em vez de ter a sua prpria. O que importa e a finalidade do programa e o quo bem implementado ele esteja.

    Tais funes que falamos, bsicas, fazem parte da biblioteca C padro (citada acima). Todo compilador C a possui, ele faz parte da padronizao ANSI C. Seu compilador, independente do sistema que voc utiliza, deve possuir. Outras bibliotecas a mais, alm das padronizadas pelo ANSI, tambm vem junto com seu compilador porm no recomendado a utilizao, caso voc queira escrever programas portveis (que rode em todas as plataformas). Podemos aqui citar programao grfica, de rede, etc como casos que so "perigosos" para programao portvel. No estou

    Page 7 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • dizendo que voc no deve programar para estas reas, futuramente havero tutoriais para essas reas por aqui, porm deve atentar-se que tal programao peculiar a plataforma que voc est utilizando e fazer algo padronizado portvel torna-se quase impossvel.

    Printf():

    Se desejamos citar uma funo invarivel e j consagrada que no da linguagem C, porm j pode at ser considerada a funo printf(). Ela est contida na biblioteca padro de entrada/sada (a barra eqivale a palavra e tal biblioteca se chama stdio.h, o .h eqivale a terminao de biblioteca, header em ingls).

    A funo printf quer dizer print-formated, ou imprimir formatado. A maneira mais simples de imprimir algo :

    printf("algum texto aqui!");

    Bem, comecemos ento. Caso voc no queira imprimir uma coisa fixa, um texto, mas sim algo que varie durante a execuo de um programa, digamos uma varivel. Chamemos de controladores de seqncia os caracteres especiais que significaro as variveis que sero impressas pela funo. O lugar onde o controlador for colocado o lugar onde a varivel ser impressa. Por exemplo, caso queiramos imprimir um inteiro.

    printf ("O inteiro vale: %d, legal!", algum_inteiro);

    A sada ser:

    O inteiro vale: 10, legal!

    onde 10 o valor dado a varivel chamada "algum_inteiro" (sem aspas)

    Exemplo bsico de um programa em C:

    /*************************************************************/

    /* Primeiro exemplo */

    /************************************************************/

    #include /* Aqui inclumos a biblioteca */

    /* C padro de Entrada/Sada */

    /***********************************************************/

    main () /* Comentrios em C ficam nesse formato! */

    {

    printf ("Bem, nosso exemplo nmero %d em C !", 1);

    printf ("Bacana, que desse exemplo nmero %d surja o %d .. \n", 1, 1+1);

    printf ("E depois o %d ! \n", 3);

    printf (" A criatividade t em baixa e venceu de %d X %d o autor !", 1000, 0);

    }

    Page 8 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Sada:

    Bem, nosso exemplo nmero 1 em C !Bacana, que desse exemplo nmero 1 surja o 2 .. E depois o 3 ! A criatividade t em baixa e venceu de 1000 X 0 o autor !

    Bem pessoal, ltimo detalhe, usem o frum de programao, tem muita gente boa lendo. Vale a pena, sua dvida pode ser de outra pessoa, uma vai ajudando a outra e cria-se uma grande comunidade, a interao essencial !

    Por hoje s.

    Aula 4Comparao entre Linguagens:

    Fala galera! Tranqilo? Bem, hoje faremos algo bem interessante para os programadores que no esto familiarizados com a linguagem C, porm j so programadores de outras linguagens.

    Se voc nunca programou voc pode pular esta parte pois no ser de grande utilidade para voc.

    Bem, mostraremos uma tabela comparando as mais populares linguagens: o C, nosso alvo, o Pascal, a linguagem mais didtica que eu conheo, que 9 entre 10 alunos de programao h 2 anos atrs aprendiam e o Basic, como o Pascal, mas num passado um pouco mais remoto. Tanto Pascal como Basic foram muito teis e so legais de se programar porm tem suas limitaes e sejamos sinceros, j passaram do seu tempo.

    O N/D quer dizer No Disponvel.

    Repare, as expresses de loop do C so mais robustas do que nas outras linguagens. Alm disso, a entrada e sada do C

    C Pascal BASIC = := = == = = *,/ *,/ *,/ /,% div,mod DIV,MOD printf (".."); writeln('...'); PRINT"..." scanf ("...", &a) readln(a); INPUT a for (x = ..;...;) for x := ...to FOR x = ... { } begin end NEXT x while(...) { } while ... do begin end N/D do { while(...) N/D N/D N/D repeat until (...) REPEAT UNTIL ... if (...) else if ... then ... else IF .. THEN ... ELSE switch(...) { case: ... } case ... of end; N/D /* ... */ { ... } REM ... * ^ ?!$

    union N/D N/D struct record N/D

    Page 9 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • mais flexvel. E, em relao ao Basic, o C pode executar todas operaes com strings e vrias outras.

    Exerccios II:

    Vamos l, de novo, algumas perguntas para voc testar seus conhecimentos. Caso voc acerte menos de 1, releia os artigos anteriores:

    Escreva um comando para imprimir "Ol mundo!" Escreva um comando para imprimir o numero 101 de trs formas diferentes. Porque existem to poucas palavras reservadas no C ? O que uma funo? Cite alguma. O que uma biblioteca? Cite alguma e sua funo. Caso voc seja programador em Basic e/ou Pascal, trace suas perspectivas em relao ao C citando seus diferenciais.

    Esqueci de falar, essa aula foi mais relax com objetivo de vocs fazerem uma reviso de tudo que aconteceu at aqui. Caso no estejam entendendo, voltem, releiam e realmente entendam. Quem entendeu tudo, descanse essa semana. Semana que vem voltaremos ao normal.

    Ok. Por hoje isso. Qualquer problema, continuem utilizando nossos fruns. Comentrios, sugestes e observaes mandem-nos e-mail!

    Aula 5Introduo

    Como foram de descanso? Semana passada realmente estava meio mole, e resolvi aumentar o nvel esta semana. Vamos ver a opinio de vocs no final, vou adiantando que hoje muita coisa referncia e de cultura geral, mas tem muitos conceitos novos e necessrios.

    Falamos de alguns conceitos de Sistemas Operacionais, caractersticas poderosas herdadas dos velhos e robustos sistemas Unix e vrias outras coisas.

    Caso tenham problemas para entender de primeira, releiam o texto, sempre o recomendado. Muitos no fazem isso, me mandam e-mail, eu aconselho e tudo termina bem !:)

    Vale ressaltar que dvidas so comuns e sempre nos depararemos com elas, mas transpassaremos e chegaremos ao nosso objetivo.

    Vamos l ..

    Quem realmente controla os programas?

    Quem controla as aes mais bsicas de um computador, o Sistema Operacional. o que podemos chamar de camada de software, que faz a interface (comunicao) entre os usurios e o Hardware(parte fsica da mquina, placas, circuitos, memrias). O objetivo bsico controlar as atividades do Hardware e prover um ambiente agradvel para o usurio do sistema, que ele possa trabalhar com maior grau de abstrao(se preocupar menos com problemas relativos ao tipo de mquina, como ela funcione e pensar mais no problema real que tem de ser resolvido).

    O Sistema Operacional(SO), tem dois componentes bsicos importantes para o usurio : sistema de arquivos e interpretador de comandos. O SO que coordena todo trfego de sada e entrada de informaes. Por exemplo, ele que determina o que vai para a tela, o que vem do teclado, movimentos do mouse, etc...

    O Interpretador de comandos aceita toda interao com o usurio, e faz todo trabalho de gerenciamento, analisando o que vem do usurio, por exemplo, e entregando para o SO de forma que ele entenda. Ele uma interface, digamos

    Page 10 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • assim, entre usurio e SO. Faz com que eles falem a mesma lngua, para simplificar a histria.

    O interpretador de comandos conhecido no mundo Linux como SHELL (pode variar para outros sistemas).

    Interfaces Grficas

    Atualmente, como cheguei a citar em artigos anteriores, existe uma tendncia da programao Grfica, baseada em Interfaces(GUI, Graphical User Interface), s que no considero das melhores nfases que se deve dar a programao. No que seja totalmente intil, realmente h situaes que ela se torna necessria. Para alguns sistemas como para

    supermercados, voc precisa fazer um programa core (explicao abaixo), e dar para as atendentes um ambiente agradvel de programao, e de rpido e fcil aprendizado. Vale ressaltar que abordaremos programao grfica em prximas colunas, agradando gregos e troianos.

    Uma questo interessante separarmos os termos, Back-end e Front-end. Back-end, a parte core(a parte interna, o cdigo que executa realmente as tarefas). A parte grfica conhecida como Front-end, uma capa, como se fosse a casca, embalagem, a apresentao do trabalho. No h dvidas, que situaes existam que essa "cara bonita" necessariamente deve aparecer.

    As linguagens de programao e o C

    Quando vrias das linguagens de programao antigas foram desenvolvidos, elas foram criados para rodar em computadores de grande porte(grandes mquinas de tamanhos de prdios, depois andares, depois salas...), Sistemas Multi-Usurios(vrios operadores usando o sistema ao mesmo tempo), time-sharing((tempo compartilhado), todos esses usurios dividiam uma frao(parte) da unidade de processamento) e eram incapazes de interagir diretamente com o usurio(vrios detalhes tcnicos so citados meramente como curiosidades para aprendizado histrico, no se preocupe caso tenha fugido algo).

    O C diferente de tudo isso pois possui um modelo de implementao de forma bem definida, e melhor desenhado. Podemos dizer que o C um primor em termos de design. Todos mecanismos de entrada/sada de dados no so definidos como partes fixas da linguagem, imutveis e embutidos no cdigo. Existe um arquivo padro, que deve ser declarado(explicaremos, mas podemos entender como chamado, utilizado) no comeo do programa, que ensina ao C como ele deve se comportar em situaes de entrada/sada, no computador que ele est rodando.

    Quando mudamos de arquitetura, s mudar este arquivo. Ele conhecido como Biblioteca C padro(ainda explicaremos melhor isso tudo). Ela padro no sentindo de implementar(ter para executar) um conjunto de instrues que todos os computadores e SO's devem implementar, mas so especialmente adaptados ao seu sistema atual. Basicamente, ela existe em todos os tipos de sistemas, funciona de forma padro, mas, internamente escrita para a arquitetura de computador que voc est utilizando(arquitetura == tipo). Lembre-se, no se vive simplesmente da arquitetura Intel, i386. Existem diversas outras por a, uma caracterstica marcante do C sua portabilidade(capacidade de rodar em mltiplas plataformas).

    Dispositivos de Entrada/Sada

    O Sistema de Arquivos do Linux pode ser considerado parte ativa do Sistema de Entrada/Sada, fluxo de dados, em sistemas Unix-Like(Linux tambm). Em vrios SO's, ele prprio coordena os recursos/movimentao entre entrada/sada, isso tudo atravs de arquivos ou fluxo de dados.

    O C faz isso tudo implcito (herdado dos Unix). O arquivo de onde o C geralmente pega a entrada, chama-se stdin, que quer dizer Standard Input(ou entrada padro). Ele geralmente costuma ser o Teclado. O arquivo correspondente para sada, conhecido como stdout, ou Standard Output (sada padro). O monitor de vdeo faz esse papel.

    importante deixar claro, que o monitor e nem o teclado, so arquivos. Eles so perifricos reais(no possvel reler

    Page 11 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • algo que foi enviado ao monitor ou rescrever para o teclado).

    Devemos representa-los atravs de arquivos, mas devemos entender, que o arquivo de entrada padro, teclado, serve apenas para leitura. J o monitor, de sada padro, simplesmente trabalha com escrita. Nota-se, caractersticas de escrita e leitura bem definidos.

    Porque utiliz-los ?

    Uma boa explicao para utilizarmos os tais arquivos nos abstermos de como funcionam a fundo, realmente essa "camada" de abstrao. Pensarmos simplesmente em utiliza-los (tudo ficar claro com o tempo). Com isso criamos essa camada que pode ser utilizado com diversos outros tipos de perifricos, de forma igualmente transparente e fcil.

    Os nomes do arquivos de dispositivos, em geral so conhecidos por abreviaturas de seus nomes originais. A impressora, por exemplo, conhecida como LP, ou Line Printer.

    Bem pessoal, por hoje s. O que acharam ? Espero que tenham gostado, aguardo o feedback e muitas mensagens nos fruns.

    Aula 6S aviso aos navegantes, essa aula vai ser um pouco grandinha mas semana que vem piora! Estou brincando, vamos l que tem muito o que falar .. fiquem tranqilos, tudo normal e o aprendizado sempre faz parte de uma fase, depois as coisas vo se encaixando e fica tudo mais tranqilo, todos conseguiro superar.

    Extenses de arquivo

    Existe uma conveno usada pelos compiladores para denominarmos os programas escritos em C e todos elementos que se referem ao conjunto programa. As denominaes encontradas so:

    O fonte do programa: nome_do_programa.c Arquivo Objeto: nome_do_programa.o Arquivo no formato executvel: nome_do_programa ou nome_do_programa.exe (no Linux) Arquivo de cabealho: Nome_da_Biblioteca.h Biblioteca: libNome_da_Biblioteca.so libNome_da_Biblioteca.a

    O final do arquivo aps o ponto (c,o,a,so ou nada) identifica o tipo de arquivo para o compilador. Ele usa isso para gerar o executvel. Os arquivos objeto e executvel podem ser deletados sem problemas, so fceis de serem gerados. J o .c o fonte do programa, ele que contm o cdigo real do que o programa far. Para executar o compilar, voc deve:

    cc -o nome_do_executvel nome_do_programa.cQue chama o CC, ou, C Compiler, em geral o GCC, compilador C da GNU.

    Detalhes que fazem a diferena na hora de arrumar o sistema

    Um detalhe interessante de se saber como parar a execuo de um programa. Todo sistema tem sua forma particular de fazer isso. Em geral, devemos pressionar Ctrl (tecla Control) junto com C, ou junto com Z, ou mesmo D.

    Outra, o comando ls equivalente ao DIR do DOS e permite listar os arquivos do diretrio atual. O comando cd, change dir, tambm equivalente a outros sistemas, serve para trocar de diretrio.

    Page 12 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Pergunta bastante comum quanto aos ambientes de desenvolvimento para se fazer um programa em C. Um editor recomendvel e muito simptico chama-se VIM (veio do famosssimo VI). Eu acho ele bastante prtico, tem indicao de comandos e se integra bastante confortavelmente com o sistema. Existem outros, como o emacs (muito adoram) e alguns mais grficos como o rhide , que parece com o Turbo C, bem prtico. Outro que tem sido bem comentando, para X,

    chama-se Code Crusader, de uma checada na CNET, tem sido um dos mais baixados por l. Vale reforar o XWPE, tambm muito bom e que foi ao ar em nosso artigo de programas de algumas semanas atrs.

    Exerccios

    Bem, alguns exerccios antes de prosseguirmos, para analisarmos como estamos. At agora parece que a margem de acertos e entendimento est relativamente alta.

    1) Para que serve um Sistema Operacional? Quais suas funcionalidades?2) Explique o mecanismo de direcionamento de sada/entrada? Faa uma relao e cite exemplos.3) Se voc tiver um programa que quer chamar de "meuprimeiroteste", sem aspas, como voc deveria chama-lo? Quais seriam os arquivos gerados pelo compilador, aps utiliza-lo?4) Como voc deveriam rodar esse programa?

    Aula 7Continuando..

    O arquivo de cabealho mais comum existente hoje o padro de entrada/sada, da biblioteca C padro.

    Para incluir um cabealho, adicione ao cdigo fonte:#include cabecalho.h em cima do programa.

    #include "meu_cabecalho.h"para incluir um arquivo pessoal, que esteja no diretrio atual.

    #include quando ele se encontra em um dos diretrios padro, como /usr/include.

    A diretiva #include um comando para o pr-processador, que falaremos em outra semana.

    Existem situaes que no precisamos dizer cabealho algum ou ter bibliotecas chamadas explicitamente, todo programa utiliza a biblioteca c padro, libc. Sempre. Ou seja, programas que utilizam de suas funes no precisam que a chamem explicitamente.

    #include

    main() {printf ("Biblioteca C padro incluida\n"); printf ("Estamos brincando em OLinux!");}

    Um programa que use funes matemticas, como por exemplo "seno", precisar adicionar os cabealho da respectiva biblioteca matemtica.

    #include

    Page 13 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • #include

    main ()

    { double x,y;

    y = sin (x);printf ("Biblioteca matemtica okay!"); }

    Existem variaes de sistema para sistema. Isso em relao a mouse, desenhos de janelas, propriedades do terminal e vrias outras situaes. Necessariamente, voc ter que procurar no manual do sistema (man funo, uma ajuda e tanto) ou do compilador.

    No importa quantas bibliotecas voc usar, sua limitao ser em geral memria, toda biblioteca adiciona o fonte e o cdigo objeto. Sistemas Operacionais como o Linux tem a capacidade de distinguir e pegar apenas as funes que interessam. J outros, so obrigados a adicionar todos os cdigos na memria, e depois de j ter perdido tempo e espao.

    Perguntas

    1. Como uma biblioteca incorporada a linguagem C?2. Qual nome da principal biblioteca em C?3. possvel adicionar novas funes, com o mesmo nome das biblioteca C padro?

    A forma de um programa em C

    C uma das linguagens mais flexveis em termos de formato j existentes. uma linguagem livre de formato. Isso quer dizer que no existem regras de onde quebrar linhas, botar chaves, e assim vai. Isso ao mesmo tempo vantajoso mas perigoso. A vantagem que o usurio tem a liberdade para criar um estilo que melhor lhe atenda. A desvantagem que programas "bizarros" podem aparecer, e de impossvel manuteno. Algumas dicas de se escolher uma estrutura bem definida:

    * Programas maiores so de gerenciamento possvel s se estiverem bem organizados.

    * Programas so entendidos somente se os nomes de variveis e funes condizem com o que fazem.

    * mais fcil achar partes de um programa se ele tiver bem ordenado, impossvel num programa totalmente desorganizado e "macarrnico" se achar algo.

    Simplesmente regras rgidas na hora de escrever um programa no significam que ele ter xito. Experincia na programao, muito bom senso e clareza de idias so fatores decisivos na hora de se programar.

    Bem, por a, Abraos.

    Aula 8Bem, estou gostando de receber os e-mails de vocs, continuem mandando. Quanto ao contedo, falaremos de variveis! Ou seja, uma assunto interessante. Essa aula juntar com a prxima, ser uma seqncia importante e conceitos indispensveis para programao em qualquer linguagem. Vamos l ..

    Page 14 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • O que so variveis?

    So espaos reservados que guardam valores durante a execuo de um programa. Como o nome diz, elas tem a capacidade de "variar" no tempo. Em geral, so exatamente um pedao de memria (o tamanho depende do que se esteja guardando) no qual botamos alguma informao e podemos nos referir a ela, utiliz-la, alter-la ou fazermos o que bem entendermos durante a execuo de um programa.

    Toda varivel tem um nome pela qual chamada (identificada) e um tipo (o que ela guardar). Os nomes podem ser de uma letra at palavras. Obrigatoriamente deve comear por uma letra ou underscore (o sinal de menos achatado: "_"). O restante pode ser letras de A at Z, maisculas, minsculas, nmeros e o underscore. Exemplos: e, varivel _essa_e_uma_variavel, tambem_variavel. Vale ressaltar que ela sensvel a case, o que significa que diferencia maisculas e minsculas.

    As variveis possuem tipos, como dito anteriormente. Os tipos dizem ao compilador que tipo de dado ser armazenado. Isso feito com o intuito do compilador obter as informaes necessrias sobre quanto de memria ele ter que reservar para uma determinada varivel. Tambm ajuda o compilador com uma lista de variveis em um lugar reservado de memria, para que ele possa fazer referncias, checar nomes e tipos e que possa determinar erros. Basicamente possibilita uma estrutura bem definida do que usado e uma arrumao conveniente na memria.

    Tipos de dados em C

    Existem vrios tipos de dados em C. Todos eles so palavras reservadas. O C bem flexvel e possibilita a criao de tipos (iremos ver isso em outra oportunidade). Agora vamos aos tipos mais usuais, j d para o comeo.

    char: Caracter unitrio (s 1 mesmo) short int: inteiro "pequeno" int: um inteiro (em geral 32 bits) float: nmero real double: nmero real grande

    Existem tambm os tipos void, enum, volatile que citaremos futuramente. No podemos esquecer dos ponteiros, que falaremos tambm em futuros captulos.

    Outro detalhe, existe a possibilidade de se colocar a palavra unsigned, que significa no sinalizado, antes de um tipo. Isso quer dizer que um inteiro, por exemplo, que varia entre -32.768 at 32767 (isso calcula-se atravs do tamanho mximo que ele pode ocupar em memria) variaria s de 0 em diante. Ou seja, o espao do menos seria utilizado para mais um nmero, ficaramos com 0 at 65535, gastando o mesmo espao de memria s que de forma diferente.

    Declarando minha primeira varivel

    Para declarar uma varivel, precisamos apenas dizer o tipo da varivel, seguida de uma lista dos identificadores (nomes), separado por vrgula. Por exemplo:

    char ch;int i,j;double x,y,z;

    muito interessante a forma que o C trabalha com variveis, desde a declarao, passagem de parmetros e todos tipos de operaes com variveis, ele checa, e torna os problemas referentes a isso mais facilmente de serem detectados.

    Variveis Globais x Locais

    Existem basicamente dois tipos de varveis, as locais e as globais. As locais so aquelas que s o pedao (pedao == funo e ser explicado na prxima aula) do programa que a pertence poder alter-la. J a global, todo programa poder mexer com ela. Citaremos exemplos mais especficos depois, fique tranqilo se foi muito abstrato.

    Page 15 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Inicializando variveis

    As variveis em C, em geral, no so necessariamente zeradas quando so declaradas. Vamos pensar, as variveis so pedaos de memria, quando resolvo declarar alguma varivel, estamos associando um nome com um pedao da memria.

    Este pedao de memria pode estar sujo, ou algo assim, e acaba interferindo no que vou utilizar numa varivel que seria "limpa". Por isso, torne uma prtica dar valores (iniciar) as variveis antes de utiliz-las.

    Podemos fazer isso de duas formas, inicializando ao declar-las, assim:

    int i = 0; float j = 2.0;

    Ou podemos:int i; float j;

    i = 0 ; j = 2.0 ;

    Normalmente voc deve utilizar a declarao que torne seu programa mais claro para voc. Lembre-se, clareza muito importante em um programa, artigo passado falamos disso.

    Escolhendo variveis

    Ao se escolher uma varivel, voc deve pensar:

    Qual tipo de varivel preciso para aquele dado; Escolher um nome claro para ela; Qual ser a rea de atuao da varivel (ficar mais claro na prxima semana)

    Mediante a isso, basta declara-la.

    Algumas variveis j se tornaram consagradas, como o char ch, ou o int i,j,k, para controle de laos.

    Exerccios

    O que uma varivel? Indique como declarado duas variveis inteiras de nome w e z? Quais das variveis seguintes so invlidas: 3ant, %12, _vri, Ab_1v, 0abc Qual diferena entre float e double? Quais as possibilidade de declarao de variveis em termos de locais em C?

    Bem, isso pessoal, prxima aula tem mais ..

    Aula 9Pessoal, nessa aula falaremos sobre um conceito muito importante, que o de funo. Caso no estejam entendendo alguma coisa at aqui, mesmo aps ler esta aula, voltem e releiam, as bases da programao esto sendo vistas.

    Page 16 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Aproveito para agradecer os emails que tenham recebido, continuem mandando e usem o frum tambm.

    O que so funes?

    Como o nome diz, intuitivamente, so "coisas" que desenvolvem tarefas, funes! Brilhante, vamos l. Funes so caixas pretas, onde voc passa algum tipo de dado, e espera receber algum tipo de sada. Explicando tecnicamente, so mdulos ou blocos de cdigo que executam uma determinada tarefa. Essa a melhor definio.

    Para que servem elas?

    As tais funes existem, por dois motivos bsicos: depurao de erros, quando se quebra um problema em pedaos menores, fica mais fcil detectar onde pode existir um problema. Outro motivo a reutilizao. visvel que grande parte dos cdigos que existem em um programa so repetidos, s se diferenciando as variveis que so passadas a eles.

    Trazendo para a vida real, duas situaes. A primeira, eu tenho que montar um carro. Posso fazer uma mquina que eu passe todas as peas e ela me retorne o resultado. Ou posso criar uma mquina que gerencie vrias outras pequenas que desempenham tarefas diferentes que, juntando-as, eu obtenho o carro pronto. Intuitivamente, gostaramos da primeira, mas devemos pensar que uma grande caixa preta pior de se depurar do que vrias outras pequenas e de tarefas especficas. Imagine se acontece algum problema na caixa preta grande, teramos que abri-la toda, mexer em vrias coisas e tentar chegar a uma concluso em relao ao problema. J em um monte de caixas pequenas especializadas, detectaramos o problema muito mais facilmente, s pelas tarefas que elas realizam. Podemos citar no s questo de problemas, como performance, entendimento e confiabilidade.

    Para que servem? (II)

    Outra situao. Imagine que eu precise fazer uma calculadora. Eu poderia fazer um conjunto de operaes (funo), que em um bolo de cdigo calculasse todos os tipos de operaes matemticas desejveis em minha calculadora no momento. Agora pense, depois de 1 ano, eu preciso de 2 operaes matemticas das 15 que minha calculadora antiga fazia, o que fazer ? Agregar o bolo de cdigo com 15 funes, 13 delas desnecessrias? A modularizao serve para o reaproveitamento de cdigo, devemos chegar a pedaos razoveis e especializados de cdigo que nos resolvam problemas e que possamos utiliza-los depois.

    Lembre-se, isso uma prtica no muito fcil, depende da experincia do profissional e como ele faz a anlise inicial do problema, quebrando-os em menores pedaos e chegando a mdulos pequenos e ao mesmo tempo usuais.

    Nomes

    Bem, podemos dar nomes as funes assim como em variveis, lembre-se da aula passada. Letras de A at Z, sem preocupao de case (maiscula/minscula), de 0 a 9 e com underscore (aquele menos achatado, "_"). Precisa comear por um caracter ou underscore. sensitivo a case, ou seja, funes com o mesmo nome, mas letras diferentes (em case) no so consideradas iguais. Podemos exemplificar: esta_e_uma_funcao e Esta_e_uma_funcao, o "E" ("e") diferente!

    Cara de uma funo

    Bem, falamos muito de funo, mas no mostramos sua cara, ento veja:

    tipo nome(tipo1 var1, tipo2 var2, ...){cdigo1; ...cdigoN;}

    Page 17 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • A cara de uma funo essa, vou exemplificar:

    void diminuir(int parcela1, int parcela2){int total;total = parcela1 - parcela2; printf ("A subtracao vale: %d",total);}

    Ignore a palavra void por enquanto, acredite que ela quer dizer nada pelo momento. Quando a chamo, diminuir(5,3);, eu recebo a mensagem da subtrao de 5 por 3, e retorno ao meu programa. Conseguiu materializar?

    Note que as chaves ({ e }) delimitam o que da funo (bloco) e o que no .

    A funo main()

    A funo main() a funo principal de um programa. Ou seja, todo programa tem que ter a funo main(), caso contrrio o compilador reclama e no gera o executvel.

    Um programa comea executando a funo main(). E um programa termina, quando esta funo termina. Porm, dentro da funo main() voc pode chamar (executar) outras funes. Falaremos mais sobre o main() adiante.

    Chamando funes

    Bem, podemos chamar (executar) as funes do ponto que desejamos, desde que ela j tenha sido declarada. Ela desvia o fluxo do programa, por exemplo:

    main(){int a=10,b=3;ao1;ao2;diminuir(a,b);ao3;}

    Nota: neste exemplo ao 1, 2 e 3, podem ser qualquer comando (At mesmo outra funo).

    O programa desviar o fluxo, aps a "ao2", quando ele chamar a funo diminuir. isto suspender temporariamente a execuo do programa para poder executar a funo diminuir, at que a mesma termine (retorne).

    Tipos de funes

    Existem basicamente, dois tipos de funes. Aquelas que retornam alguma coisa a quem a chamou e aquela que no retorna nada.

    Comeando pelas que no retornam, elas simplesmente realizam tarefas, como o exemplo anterior. Ela faz uma srie de passos, e retorna o fluxo ao programa principal, sem interferir em nada em sua execuo, a no ser pelo tempo perdido e sada na tela.

    Outra opo so funes que retornam um valor de um tipo. Lembre-se, como declaramos uma funo? tipoX nome(tipo1 var1,tipo2 var2); e assim vai. Ou seja, o tipoX eqivale ao que a funo vai retornar. Vamos entender:

    int diminuir(int parcela1, int parcela2){int total;total = parcela1 - parcela2;

    Page 18 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • return total;}

    main(){int a=10,b=3,total;ao1;ao2;total = diminuir(a,b);printf ("A subtracao vale: %d",total);ao3;}

    O efeito exatamente o mesmo, s que agora o programa principal que estar jogando a mensagem na tela e a varivel do programa, chamada total, que ter o valor da subtrao (resultado, tipo int, retornado de diminuir(a,b)). Aos poucos vamos juntando as peas.

    Vale ressaltar, o que determinou a sada da funo. No caso, foi a chamada ao comando return, que interrompe o fluxo do bloco que est sendo executado (saindo deste bloco) e volta aquele imediatamente anterior. No necessrio chegar at a ltima linha da funo, o return pode estar na 1a, 2a, onde quer que seja.

    O que o main?

    main() tambm uma funo, a funo que obrigada a existir em todos os programas. Como j disse, tal funo procurada e a primeira a ser executada em todo programa.

    Ela pode retornar um valor de tipo int. Ou seja, retorna um nmero, em geral para o sistema operacional, com o cdigo de sucesso ou indicando qual o erro (nmero do erro) ocorreu durante a execuo do programa.

    Exerccios

    Vamos testar alguns conhecimentos.

    Escreva uma funo que pegue dois nmeros, ache a multiplicao entre eles e jogue na tela. Escreva o mesmo programa, s que agora ele deve passar para uma varivel do programa principal, que ir

    somar o resultado a 3 e dividir por 2. Explique qual a diferena entre funes que retornam ou no valores. Qual utilidade do tipo de uma funo? Qual tipo de funo devemos utilizar quando no queremos retornar nada?

    Bem, isso pessoal, espero que tenham compreendido. Reforando, mande e-mail se necessrio e postem dvidas no frum.

    Aula 10Muito bem, desta vez eu vou escrever o artigo de programao desta semana, tendo em vista que o Elias no pode, pois anda ocupado, trabalhando demais (legal, conta outra). Estou brincando hein Elias?

    Nesta semana estaremos falando sobre os comandos de controle (if,while,for) que iro lhe dar maior poder de programao. Depois desta aula, voc j estar capacitado a criar seus primeiros programas e impressionar seus amigos.

    Page 19 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Verdadeiro e Falso

    Bom, vamos comear falando sobre o conceito de verdadeiro e falso, pois so utilizados constantemente em programas.

    Para a linguagem C, quando uma varivel contm o valor 0 (zero), ela est com o valor falso. Qualquer outro valor diferente de zero (positivo ou negativo), significa verdadeiro.

    Generalizando, qualquer coisa diferente de zero "verdadeiro" e qualquer coisa igual a zero "falso".

    Voc deve estar se perguntando agora qual a utilidade disto. Veremos a seguir.

    O Comando de Controle IF

    O comando de controle if (em portugus: se) o mais famoso de todas as linguagens de programao, em todas ele existe. Sua finalidade, verificar se uma condio "verdadeira", e caso seja, ento executar determinada tarefa (que pode ser uma funo).

    O formato do if o seguinte:if (expresso) {tarefa1}

    NOTA: O comando if deve ser escrito sempre em letras minsculas, caso contrrio no ir funcionar, todos comando do C so sensveis a case.

    A expresso do if na verdade a condio lgica para que ele execute a tarefa1. Esta expresso caso seja numrica, pode ser comparada assim:int a;int b;if (a comparao b) {tarefa1}

    tarefa1 s ser executada se a comparao entre a e b retornar verdadeira.

    Onde comparao pode ser:== : Retorna "verdadeiro" se o primeiro nmero (varivel) for igual ao segundo. Falso caso contrrio.!= : Retorna "verdadeiro" se o primeiro nmero (varivel) for diferente do segundo. Falso caso contrrio.> : Retorna "verdadeiro" se o primeiro nmero (varivel) for maior que o segundo. Falso caso contrrio.>= : Retorna "verdadeiro" se o primeiro nmero (varivel) for maior ou igual ao segundo. Falso caso contrrio.< : Retorna "verdadeiro" se o primeiro nmero (varivel) for menor que o segundo. Falso caso contrrio.3) printf("primeiro maior que 3");if (primeiro!=segundo) printf("primeiro diferente do segundo");}

    NOTA: Quando for executar apenas uma tarefa (como o printf no exemplo) no necessrio o uso das chaves. Caso voc queira executar mais de um comando, use as chaves ({ e }).

    No exemplo acima a expresso (primeiro>3) vai retornar "verdadeiro" e ir imprimir na tela "primeiro maior que 3".

    Page 20 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Podemos ainda usar o termo else (traduz-se para: seno) ao final do if caso a expresso seja falsa, para executar outra tarefa. Exemplo:

    main() {int x=10;int y=2;if (x>y) printf("x maior que y");else printf("x menor que y");}

    Traduzindo: se x maior que y imprima na tela "x maior que y", seno imprima na tela "x menor que y".

    Como dissemos antes, o que zero "falso" e o que diferente de zero "verdadeiro". Voc pode usar o retorno de uma funo como expresso para o if. O smbolo ! (not, negao) inverte o valor lgico da expresso. Por exemplo:

    int maior(int a, int b) {if (a>b) return 1;else retun 0;}

    main() {int a=10;int b=20;if (!maior(a,b)) printf("a menor que b");}

    Traduzindo: Se a no (!) for maior que b imprima na tela "a menor que b".

    Ainda sobre o if podemos destacar os operadores lgicos and e or. Estes dois so representados pelos smbolos && e ||, respectivamente. O primeiro um e e o segundo um ou. So usados como neste exemplo:

    main() {int a=10;int b=20;int c=30;if (ab) printf("c o maior de todos");if (a==10 || a==5) prnt("a igual a 5 ou 10");}

    Traduzindo: Se a for menor que b, e c for maior do que b imprima na tela "c o maior de todos". Se a for igual a 10 oua for igual a 5 imprima na tela "a igual a 5 ou 10".

    Pode-se usar mais de um and e mais de um or, inclusive em conjunto, tornando a lgica um pouco mais complexa.

    O Comando de Controle While

    O while (em portugus: enquanto) serve para se deixar um programa em loop (rodando a mesma coisa, travado de propsito) at que a expresso que o prende seja verdadeira. O while tem dois formatos:

    while (expresso) { tarefa1}

    do {tarefa1;} while (expresso);

    Page 21 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Exemplo:main() {int b=2;int a=0;while (a!=b) {a=a+1;}}

    Traduzindo: enquanto a for diferente de b some 1 ao valor atual de a. Ou seja, em duas execues de "a=a+1", o valor de a igual ao de b que 2.

    NOTA: A expresso "a=a+1" no uma expresso matemtica vlida. Porm, em programao isto vale, pois a varivel a esquerda do smbolo de igualdade (=) na verdade est recebendo o valor da expresso direita do igual (=). Ou seja, a posio de memria da varivel a preenchida com o resultado de "a+1".

    Exemplo2:main() {int a=2;do {a=a-1;} while (a!=0);}

    Traduzindo: faa "a=a-1" enquanto a for diferente de zero. Ou seja, tire 1 de a at que seu valor seja zero.

    O Comando de Controle FOR

    Imagine o for como um while com limites definidos. Este o formato do for:

    for (valor_inicial;condio;passo) {tarefa1;}

    valor_inicial o valor inicial de uma varivel numrica qualquer.condio indica qual a condio de parada do for (expresso de verdadeiro ou falso), um while. passo o que deve ser executado ao final de uma execuo de tarefa1 cuja condio do for ainda no foi satisfeita.

    Exemplo:main() {int i;for (i=0;i

  • }main() {int a=10;int b=5;int c=8;while (!maior(b,a)) {b=b+1;if (b==c) printf ("b vale o mesmo que c");}

    Traduzindo: Enquanto b no for maior do que a some 1 ao valor atual de b e se b agora for igual a c imprima na tela "b vale o mesmo que c". Ou seja, o valor de b vai crescendo (6,7,8,...). Quando b chega em 8, o if ir ativar o printf que imprimir na tela "b vale o mesmo que c". O programa termina quando b chega a 11, pois b vai ser maior do que a, o que far sair do while.

    Exerccios

    1) Escreva uma funo que recebe dois nmeros inteiros e verifica se so iguais. Se forem iguais retorna "verdadeiro" (diferente de zero). Caso contrrio retorna "falso" (zero).2) Use a funo do item 1) em uma programa que verifica se 10 diferente de 5, sem alterar a funo do item 1).3) Faa um programa que some os 10 primeiros nmeros naturais usando o comando for.4) Faa o mesmo programa que no item 3), porm usando o comando while.

    Com isso conclumos nosso curso de C desta semana. Foi um pouco puxado, mas tentei explicar tudo o mais claro possvel. No deixe de reler este artigo e praticar, estes comandos e conceitos aprendidos hoje so os mais importantes em qualquer linguagem de programao.

    Espero que tenham gostado. Qualquer dvida postem no frum, ou mandem e-mail. Crticas e sugestes tambm so bem vindas.

    Aula 11Estou de volta, agora o Elias saiu para o carnaval mais cedo. Nossos artigos esto sendo escritos muito antes de propsito, assim podemos viajar no carnaval.

    Nesta aula de hoje, estaremos praticando os comandos de controle ensinados na aula passada. Se voc quer se tornar um bom programador tem que se acostumar a praticar sempre que possvel. Ento mos a obra!

    Conhecendo melhor a funo printf

    Vamos ento aprender a funo printf um pouco mais a fundo. Sabemos que os tipos bsicos de variveis so: int (inteiro), char (caractere) e float (real). Para imprimir uma varivel de um tipo destes, usamos a referncia abaixo:

    %d -> Para variveis do tipo int (inteiros)%c -> Para variveis do tipo char (caractere)%f -> Para variveis do tipo float (real)

    Exemplo:

    #include

    main() {

    Page 23 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • int x;char y;float z;x=10;y='2';z=5.2;printf("int: %d \n char: %c \n float: %f \n",x,y,z);}

    Traduzindo: O %d o primeiro que aparece entre aspas, logo ser substitudo pelo valor da primeira varivel depois das aspas (x). O %c o segundo que aparece entre as aspas, logo ser substitudo pelo valor da segunda varivel depois das aspas (y). O mesmo ocorre para o %f que ser substitudo pelo valor de z.

    NOTA: O \n indica quebra de linha. Ou seja, quando o printf encontra o \n ele pula linha.

    A funo scanf

    Assim como o printf, o scanf tambm funciona a base de %d, %f e %c. O scanf serve para pegar algo digitado do teclado.

    Exemplo:

    #include

    main() {int valor;scanf("%d",&valor);printf("Voc digitou: %d\n",valor);}

    NOTA: Sempre use o &, est ali de propsito. Mais tarde no curso explicaremos o porque disto.

    Ou seja, no scanf voc apenas coloca o(s) tipo(s) que quer pegar e em que varivel vai ficar o valor (no esquece do &).

    Vamos aprender ento a fazer um programa de perguntas.

    Programa de Perguntas

    Vamos fazer um simples programa de perguntas que poder ser ampliado. Vou listar o cdigo e explica-lo.

    #include

    main() {char resposta;int valor;

    printf("Voc usa Linux? [s/n]");scanf("%c",&resposta);getchar();if (resposta=='n') print ("Ento o que voc est esperando? Compre j!\n");else {printf("Muito bom. H quantos anos voc o usa?");scanf("%d",&valor);getchar();if (valor>=2) print("%d anos? Voc deve ter uma boa experincia ento\n",valor);else {

    Page 24 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • printf("Legal! Voc conhece o site OLinux? [s/n]");scanf("%c",&resposta);getchar();if (resposta=='s') printf("Continue nos acompanhando ento :)");else printf("Ainda no? Ento visite: http://www.olinux.com.br. Voc no ir se arrepender :)");}}}

    Explicando: Primeiro ele pergunta: "Voc usa Linux?". Se a resposta for no (n) ento imprima: "Ento o que voc est esperando? Compre j!"Seno, se a resposta for sim:imprime: "Muito bom. H quantos anos voc o usa?"Se for maior ou igual a 2 anos imprime: "%d anos? Voc deve ter uma boa experincia ento" (onde %d vo ser os anos que usa)Seno, se for menos de 2 anos: imprime: "Legal! Voc conhece o site OLinux? [s/n]"Se a resposta for sim (s) imprime: "Continue nos acompanhando ento :)"Seno imprime: "Ainda no? Ento visite: http://www.olinux.com.br. Voc no ir se arrepender :)"

    NOTA: A funo getchar() serve para limpar a entrada do teclado. No Linux s vezes necessrio us-la, pois o Linux no tira o Enter do buffer (memria reservada) do teclado.

    AND e OR mais a fundo

    Vamos praticar o AND e OR do if.

    Exemplo:

    #include

    main() {int a;int b;int c;int fim;a=1;b=2;c=3;fim=0;while (!fim) {if ((a>3 || b>3) && c>b) fim=1;a=a+1;b=b+1;c=c+1;}}

    Traduzindo: Enquanto no for fim (fim igual a zero, fim "falso", lembram?):Se a maior que 3 ou b maior que 3, e c maior que b ento fim igual a um, ou seja, fim "verdadeiro".

    Explicando: O while fica em loop testando o if e fazendo:a=a+1;b=b+1;c=c+1;

    Page 25 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Em duas rodadas do while a expresso do if torna-se verdadeira e ele torna fim igual a um, ou seja, chegou ao fim. Agora o while ir sair pois !fim (no fim) ser "falso", pois fim "verdadeiro" (no verdadeiro = falso).

    Use quantos parnteses forem necessrios para a expresso do if ou while. Mas lembre-se, quanto mais AND e OR, mais complexa fica a lgica.

    Exerccios

    1) Faa um programa que pegue duas notas de um aluno e calcule a mdia deste aluno e a imprima na tela.2) Faa um programa de matemtica que pergunte somas simples e que fica em loop enquanto no acertar as perguntas, imprimindo na tela se a pessoa acertou ou no.

    isso a. Criem mais programas e pratiquem sempre. J viram o poder que tm nas mos?

    Qualquer dvida escrevam no frum ou mandem e-mail para mim. Crticas e sugestes tambm so bem vindas. At semana que vem.

    Aula 12Nesta semana iremos praticar funes e comandos de controle, para que semana que vem possamos ensinar novos conceitos, prosseguindo com o curso.

    preciso estar consciente da utilizao do que foi ensinado at agora, pois so as partes mais importantes da programao. Por isso a insistncia. Queremos ter certeza de que estaro aptos a prosseguir, pois no pode haver insegurana.

    Vamos ento a uma reviso aprofundada.

    Printf: Revisando

    Imprimir um texto na tela:printf("texto na tela");

    Imprimir um texto na tela com quebra de linha (\n: pular para a prxima linha):printf("texto na tela com quebra de linha\n");

    Imprimir o valor da varivel x do tipo inteiro (int) na tela:printf("O valor de x : %d",x);

    Imprimir o valor da varivel inteira x e depois o da varivel inteira y na tela:printf("O valor de y : %d e o valor de x : %d",y,x);

    Imprimir o valor da varivel inteira y e depois o da varivel inteira x na tela:printf("O valor de x : %d e o valor de y : %d",x,y);

    Imprimir o valor da varivel inteira x na tela e depois o da varivel real f:printf("x inteiro vale: %d, f real vale: %f",x,f);

    Imprimir o valor da varivel caracter a , depois o valor da varivel inteira b e depois o valor da varivel real c:printf("a vale: %c, b vale: %d e c vale: %f",a,b,c);

    Page 26 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Scanf: Revisando

    Digamos que tenhamos declarado em nosso programas as 3 seguintes variveis:int a;char b;float c;

    Vamos usar o scanf para pegar um valor do teclado para a varivel inteira a:printf("Entre com um nmero inteiro: ");scanf("%d",&a);

    Agora para a varivel caractere b:printf("Entre com uma letra ou smbolo: ");scanf("%c",&b);

    Por ltimo para a varivel real c:printf("Entre com um nmero real: ");scanf("%f",&c);

    Declarando funes

    Vamos criar a funo digaoi que imprime na tela o texto "oi":void digaoi() {printf("oi\n");}

    Vamos criar a funo maior que tem dois inteiros como entrada e verifica se o primeiro maior que o segundo. Se for, retorna 1 (verdadeiro). Seno retorna 0 (falso):int maior(int a, int b) {

    if (a>b) return 1;else return 0;}

    Vamos agora criar uma funo main (principal) que usa estas duas funes:

    #include

    void digaoi() {printf("oi\n");}

    int maior(int a, int b) {if (a>b) return 1;else return 0;}

    main() { int x=5;int y=10;int z=2;digaoi();printf("x maior que y? resposta: %d\n",maior(x,y));}

    Usando o IF

    Vamos criar uma funo main que use a funo maior e o if:

    Page 27 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • main() {int x=10;int y=2;if (maior(y,x)) printf("y maior que x\n");else printf("x menor ou igual a y\n");}

    Podemos fazer usando negao:main() {int x=10;int y=2;if (!maior(y,x)) printf ("y no maior que x\n");else printf("y maior que x\n");}

    Usando o FOR

    Vamos usar o for de maneira simples em uma funo main:

    main() {int i;int k=10;printf("Eu sei contar at nove: ");for (i=0;i

  • } while (i
  • nome = "Elias"; sobrenome = "Bareinboim";

    Temos que copiar caracter a caracter ou utilizarmos funes que j faam exatamente isso (em nosso exerccios temos isso). A biblioteca especial para tratamento de strings em C chama-se string.h. Dica: usar funo strcpy

    Para imprimirmos uma string fazemos: printf("%s",nome);. Ou seja, utilizamos o %s. Lembre-se, o %c um caracter somente.

    Todas strings em C terminam com \0. imprescindvel ter um marcador para fazermos operaes com strings. A varivel nome contm "Elias", ento:

    Para leitura de dados podemos tambm utilizar rotinas j prontas ou implementarmos as nossas prprias (teremos exerccios exatamente disso).

    Em funes devemos nos referenciar a vetores pelo seu nome absoluto, na prxima aula entenderemos tudo muito melhor, fiquem calmos !:) Exemplificando, char nome[30];, quando se passa para uma funo, passamos nome e em outro campo o nmero de elementos.

    Exerccios

    Crie uma matriz 5x5 de inteiros . Acesse o elemento da linha 3 e coluna 4 e coloque numa varivel chamada tmp. Ponha o valor 20 na primeira coluna e ltima linha.

    Faa uma funo que retorne o elemento de nmero 22. Declare uma matriz de inteiros. A dimenso deve ser 20x40x80. Acesse o elemento de ndice 2/5/10 e coloque-

    o numa varivel chamada tmp2. Faa uma funo que retorne o elemento de nmero 1024. Escreva uma funo para ler um vetor de qualquer tipo e tamanho. Faa uma para imprimir tambm. Faa uma outra funo para procurar um elemento (tipo bsico de dados) qualquer (a se passar posio de incio

    de procura) e retornar a posio da primeira ocorrncia. Com a funo acima, faa uma terceira que retorne o nmero de ocorrncia de um elemento em vetor. Escreva um programa que copie strings. O nome da funo chama-se copia_string e deve receber a origem e

    destino. Por exemplo, copia_string(destino,origem).

    Bem, os desenhos esto feios mas espero que tenha sido claros. Qualquer dvida usem o frum ou mande-me e-mail.

    E l i a s \0 0 1 2 3 4 5 6 7 8 9

    Aula 14Algum viu o Elias por a? Pois , l vou eu de novo escrever o artigo desta semana. Hoje faremos uma reviso da aula passada sobre vetores e matriz. Tambm estaremos iniciando um novo assunto: ponteiros. Eles tm vrias finalidades e so um assunto bastante importante quando se fala em C.

    Veremos porque ainda neste artigo. Mas antes faremos uma breve reviso da aula passada.

    Vetores

    Page 30 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Vetores so variveis que guardam mais de um valor. Estes valores so acessados atravs de ndices. Estes ndices sempre comeam de zero. Exemplo:

    int teste[4]={ 5, 4, 3, 2 };

    Ento a posio de ndice zero do vetor teste contm o valor inteiro 5. Acessamos assim:printf("%d\n",teste[0]);Isto imprime na tela o nmero 5, que o valor da posio zero do vetor teste.

    Para alterar um valor a simples. Exemplo:

    int teste[2]={ 10, 20 };printf("%d\n",teste[1]);teste[1]=30;printf("%d\n",teste[1]);

    No primeiro printf o valor de teste[1] 20, ele o imprime na tela. No segundo printf o valor de teste[1] 30 (pois fizemos teste[1]=30), e o printf o imprime na tela.

    Matrizes

    Matrizes so vetores com mais de uma dimenso. Exemplo:

    int teste[5][10];

    Colocamos um valor (neste exemplo 20) na linha zero e coluna 5 assim:teste[0][5]=20;

    Para ler a mesma coisa:printf("%d\n",teste[0][5]);Isto ir imprimir na tela o valor 20 que definimos acima.

    Ponteiros

    Ponteiros, como o prprio nome diz, um tipo de varivel que aponta para outra (de um tipo qualquer). Na verdade um ponteiro guarda o endereo de memria (local onde se encontra na memria) de uma varivel.

    Vamos iniciar um exemplo simples para entendermos melhor. Imagine que tenho a seguinte varivel:

    int teste=20;

    Sabemos que a varivel teste do tipo inteiro (int) e armazena o valor 20.

    Agora digamos que queremos uma ponteiro para a varivel teste. Ento criamos um ponteiro para apontar para uma varivel do tipo inteira (ou seja, apontar para teste), assim:

    int teste=20;int *p;

    Nota: Um ponteiro definido usando o asterisco (*) antes do nome da varivel.

    Neste exemplo a varivel p, por incrvel que parea, no do tipo inteiro (int). A varivel p do tipo ponteiro, que aponta para uma varivel do tipo inteiro (int).

    Page 31 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Agora faamos p apontar para a varivel teste:

    int teste=20;int *p;

    p=&teste;

    Nota: O smbolo & indica o endereo de memria da varivel.

    Fazendo p=&teste estamos dizendo que p ir armazenar o endereo de memria da varivel teste. Ou seja, p no armazena o valor 20, mas sim o endereo de teste que, este sim, armazena o valor 20.

    Mas ento como chegar ao valor 20 usando a varivel p, j que este aponta para teste?

    Simples, basta fazer assim:

    int teste=20;int *p;

    p=&teste;printf("%d\n",*p);

    Nota: Para acessar o valor de uma varivel apontada por um ponteiro, usa-se o asterisco (*) antes da varivel ponteiro.

    Neste exemplo *p retorna 20, que o valor de teste, varivel o qual armazenamos seu endereo de memria em p. Logo o printf ir imprimir 20 na tela.

    Outro exemplo:

    char algo[5] = { 5, 4, 3, 2, 1 };char *c;

    c=&algo[2];

    Neste exemplo, colocamos em c o endereo do terceiro elemento de algo. Fazendo isso, dizemos automaticamente que c[0]=3, c[1]=2 e c[2]=1.

    Se tivssemos feito c=&algo[3], ento estaramos fazendo c[0]=2 e c[1]=1.

    Quando fizemos:char algo[5]; a mesma coisa que:char *algo;Porm desta ltima maneira o tamanho de algo ainda no tem tamanho definido. Isto se faz com a funo malloc() que veremos na prximas aulas.

    Nota: Nunca use um ponteiro como vetor a menos que voc tenha definido seu tamanho. No Linux isto retornaria uma mensagem de segmentation fault pois estaria invadindo uma rea de memria no reservada para o atual programa. Em outros sistemas operacionais isto aceitvel podendo travar o mesmo.

    Nota: Para matrizes de dimenso maior que um (ou seja, no vetor) no vlido dizer, por exemplo, que char teste[2][2] eqivale char **teste. Isto s vale para vetores.

    Outra explicao

    Se voc ainda no entendeu como funcionam ponteiros imagine que variveis so casas. As casas podem armazenar um

    Page 32 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • valor, dependendo de seu tipo. Alm de valores normais, uma casa destas pode armazenar um endereo de outra casa. Nesta outra casa voc encontraria o valor desejado.

    Pode no estar claro aonde se utiliza ponteiros e o porque de usa-los. Entretanto acompanhe nossos artigos e voc vai entender porque ponteiros so muito importantes e qual sua finalidade.

    Exerccios

    1) Escreva um programa que pea ao usurio um nmero que deve ser digitado do teclado. Guarde este nmero em uma varivel. Depois faa um ponteiro apontar para a varivel que guardou este nmero e imprima-o na tela, acessando este pela varivel ponteiro.

    2) Crie uma varivel x do tipo caractere (char) e armazene nela um valor inicial. Crie agora uma varivel ponteiro chamada ptr para apontar para x. Agora, note a diferena do ponteiro para o tipo imprimindo:printf("%d\n",x);printf("%p\n",ptr);Onde "%p" pede para imprimir o endereo de memria armazenado em ptr.

    3) Tente usar um ponteiro como vetor sem usar a funo malloc() e veja o que ocorre.

    Por essa semana s. Na prxima o Elias volta (espero :). Qualquer dvida usem o frum ou mandem e-mail. Sugestes e crticas tambm so bem-vindas.

    At a prxima.

    Aula 15Algum viu o Elias por a? E o Andr Souza? Pois , estou estreando nessa semana como colunista do curso de C. Espero que o curso no perca uma identidade por minha causa pois os dois so excelentes professores de C. Deixando de papo furado, hoje a aula continuar sobre o assunto ponteiros. Vamos explicar como alocar (e desalocar) uma rea de memria, falaremos sobre porque um ponteiro pode ser tratado como um vetor e vice-versa e introduziremos strings.

    Malloc e Free

    Quando se declara um ponteiro em C, ns temos um "ponteiro", um "indicativo" para uma nica posio de memria. Isso o suficiente se voc quiser que esse ponteiro apenas te diga onde est uma varivel.

    Porm, ponteiros so usados muitas vezes quando no se sabe o tamanho de um vetor no incio de um programa. Permita-me dar um exemplo. Digamos que voc queira fazer um programa para ler as notas da prova de matemtica de uma turma de 5 srie e fazer a mdia. Voc deseja fazer um programa genrico que ser usado em um colgio que possui turmas de 5 de nmero variado de alunos. Ento voc tem 2 opes: descobrir qual o tamanho da maior turma e declarar no incio de seu programa um vetor de inteiros com esse nmero (int notas[maior_n_de_alunos]) ou declarar um ponteiro para inteiros que depois ser um vetor, quando o usurio, entrar com o nmero de alunos de cada turma a cada vez (int *notas).

    A primeira opo no malevel. Sempre poder surgir uma turma com mais alunos que o seu mximo. E se voc colocar o mximo como 1 milho, por exemplo, e nunca (ou quase nunca) estiver usando esse nmero de alunos, voc est fazendo com que seu programa desperdice memria. Por isso, a segunda opo a mais indicada. E ela possvel atravs de dois comandos de C: malloc e free. Veja abaixo como seria o exemplo com ponteiros.

    void main(){int *notas;

    Page 33 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • int numero;int i;printf("Entre com o n total de alunos: ");scanf("%d", &numero);notas = (int *) malloc(numero * sizeof(int));}

    A linha do malloc pode ser vista como: alocamos um vetor que tem nmero posies de inteiros. Agora notas pode ser acessada como um vetor qualquer.

    for(i=0; i

  • Agora a segunda e quarta linhas so as novidades. Como eu disse, a primeira posio de um vetor e de um ponteiro que aponta para esse vetor so a mesma coisa porque na verdade o ponteiro s pode apontar para a primeira posio de um vetor e no mais posies! J a 4 linha mais difcil de entender de primeira. O que fizemos foi aritmtica de ponteiros. Peguei o ponteiro pont_notas e somei nove. Porm esses nove significam nove posies de memria. Portanto, ele foi cair na dcima posio do vetor. Da coloco um * na frente e consigo pegar seu contedo!

    Vamos a mais exemplos para fixar. Abaixo vou fazer uma equivalncia entre vetor e ponteiro.

    vet_notas[0]==*(pont_notas);vet_notas[1]==*(pont_notas+1);vet_notas[2]==*(pont_notas+2);...

    Strings:

    Outro assunto interessante de C so strings. String nada mais so do que vetores de caracteres. Vamos a um exemplo:

    char nome_vetor[10];char *nome_ponteiro;

    As duas variveis, nome_vetor e nome_ponteiro so semelhantes, sendo que a nica diferena que nome_vetor no pode ter mais de 10 caracteres enquanto que nome_ponteiro pode ter a vontade desde que voc aloque as suas posies (com malloc). Veja o exemplo:

    void main(void){char nome1[10];char *nome2;printf("Nome 1: ");scanf("%s", nome1);printf("Nome 2: ");nome2 = (char *) malloc(10 * sizeof(char));scanf("%s", nome2);printf("Nome 1: %si\n", nome1);printf("Nome 2: %s", nome2); }

    Como voc pode observar, tivemos que alocar 10 posies antes de dar um scanf, pois nome2 s era um ponteiro para um caracter. Qualquer tentativa de ler um nome maior que 1 caracter iria falhar!

    Operaes com Strings

    Existem algumas funes da biblioteca padro de C para manipular strings. Vamos a elas.

    strcmp compara duas strings e retorna se uma maior que outra.

    resultado=strcmp(string1,string2);if(resultado==0) {printf("Duas strings so exatamente iguais!\n");else if(resultado>0) {printf("string1 maior que string2!\n");else printf("string2 maior que string1!\n");

    strlen retorna o comprimento de uma string em n de caracteres.

    Page 35 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • printf("Entre com seu nome: ");scanf("%s",nome);

    tamanho=strlen(nome);printf("Seu nome tem %d caracteres", tamanho);

    Semana que vem, continuaremos com ponteiros. Leiam e releiam o artigo para fixar bem os conceitos. muito importante para as prximas aulas. At l!

    Aula 16 Outro dia estava lendo um e-mail de uma lista de discusso sobre programao, e deparei com o seguinte e-mail (escrito por um brasileiro):

    I have a little problem and I'm sure someone can help me.

    I am trying to insert a text from a entry in a text(box), but I have tosay the lenght of the text to be inserted. How can I get it???

    Problem:void on_btn_Ok_pressed (GtkButton *button, gpointer user_data){char *texto;entry1 = GTK_ENTRY(lookup_widget((button),"entry1"));

    text1 = GTK_TEXT(lookup_widget((button),"box_Nome"));

    texto = (gtk_entry_get_text(entry1));

    gtk_text_insert(text1,NULL,NULL,NULL,texto, ????????????);gtk_entry_set_text(entry1,"");

    }

    Thanks I apreciate your help and time.

    Para quem no sabe ingls, o que ele quer saber como achar o tamanho da string 'texto', e colocar no lugar do '????????????'.

    Eu no sei se esta pessoa est lendo o nosso curso de C, mas realmente ainda no tocamos bem ns tpicos de manipulao de strings em C.

    No artigo desta semana estaremos tocando no assunto de manipulao de strings em C e tambm de ponteiros com funes.

    Existem inmeras funes para manipulao de strings em C, das quais as mais usadas so: strcpy,strcmp,strlen,strcat.

    strcpy:

    Esta funo serve para copiar uma string para outra em C. Os parmetros desta funo so a string fonte e a string destino, respectivamente. Exemplo:

    Page 36 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • char *string_retorno;char string_fonte[] = "EXEMPLO DE MANIPULACAO DE STRINGS";char *string_destino;

    string_destino = (char *)malloc(80);

    string_retorno = strcpy(string_destino,string_fonte);

    printf("String Fonte = %s, String Retorno = %s",string_fonte,string_retorno);

    Aps a execuo deste pequeno trecho de programa, a sada para a tela dever ser:

    String Fonte = EXEMPLO DE MANIPULACAO DE STRINGS, String Retorno = EXEMPLO DE MANIPULACAO DE STRINGS

    Neste exemplo, a string 'string_retorno' ser um ponteiro para a varivel string_destino. Esta string de retorno da funo strcpy serve somente para verificar se a cpia das strings foi feita com sucesso, exemplo:

    if (strcpy(string_fonte,string_destino) == NULL){printf("Erro ao copiar as strings\n");}

    strcmp:

    Esta funo serve para comparar duas strings. Esta funo retornar 0 (zero), se as strings forem iguais, e diferente de zero se as strings forem diferentes.

    Exemplo:char string1[]="STRING";char string2[]="STRING";char string3[]="sTRING";

    if (strcmp(string1,string2) == 0){printf("As strings so iguais\n");}else{printf("As strings so diferentes\n");}

    if (strcmp(string1,string3) == 0){printf("As strings so iguais\n");}else{printf("As strings so diferentes\n");}

    A sada deste pequeno trecho de programa dever ser:

    As strings so iguaisAs strings so diferentes

    strlen:

    Esta funo retorna o tamanho de uma string. O nico parmetro desta funo a string da qual voc quer saber o

    Page 37 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • tamanho. Neste exemplo, vamos resolver o problema que foi mostrado no incio deste artigo:

    void on_btn_Ok_pressed (GtkButton *button, gpointer user_data){char *texto;entry1 = GTK_ENTRY(lookup_widget((button),"entry1"));

    text1 = GTK_TEXT(lookup_widget((button),"box_Nome"));

    texto = (gtk_entry_get_text(entry1));/* gtk_text_insert(text1,NULL,NULL,NULL,texto, ????????????); */gtk_text_insert(text1,NULL,NULL,NULL,texto, strlen(texto));gtk_entry_set_text(entry1,"");

    }

    strcat:

    A funo strcat faz pegar a string fonte e concatenar no final da string destino. Exemplo:

    char *string_retorno;char string_final[] = "EXEMPLO DE MANIPULACAO ";char string_inicial[] = "DE STRINGS";string_retorno = strcat(string_final,string_inicial);

    printf("String Final = %s, String Inicial = %s, String Retorno = %s",string_final,string_inicial,string_retorno);

    Dessa forma a sada : String Fonte1 = EXEMPLO DE MANIPULACAO, String Fonte2 = DE STRINGS, String Retorno = EXEMPLO DE MANIPULACAO

    Hoje ficaremos por aqui porque a minha estria na seo de programao. At semana que vem com mais ponteiros.

    Aula 17Bem, iremos falar nessa semana sobre estruturas, unies e enumeraes.

    O que uma estrutura?

    um conjunto de variveis dentro de um mesmo nome. Em geral, uma varivel de um tipo especfico, por exemplo, temos uma varivel do tipo inteira e estamos fechados a nos referenciar aquele nome que lhe foi dado sempre por um nmero do tipo inteiro, logicamente. J as estruturas, dentro de um mesmo nome podemos nos referenciar a uma gama de variveis pr-definidas.

    Declarao

    Podemos criar definies de estruturas, nas quais podemos utiliz-las como "molde" (tipo) para futura utilizao. Existe uma ligao lgica entre os elementos de uma estrutura. Podemos exemplificar com uma estrutura que contenha nome, telefone e saldo na conta corrente.

    struct molde_conta{char nome[50];

    Page 38 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • int telefone;float saldo ;};

    Bem, declaramos o tipo de dado, o molde para utilizao no futuro. Repare que a linha foi terminada com ponto e vrgula, como em um comando comum. Definido o molde, devemos agora declarar a varivel que utilizar desse molde.

    struct molde_conta conta;

    Agora sim, temos a varivel conta com a definio declarada em molde_conta. Uma outra opo a declarao direta, por exemplo, j na definio do molde, declaramos as variveis de forma embutida. Assim:

    struct molde_conta{char nome[50];int telefone;float saldo;} conta, conta2;

    Continuamos com o molde chamado molde_conta e alm disso declaramos o conta e conta2 como esse tipo, o equivalente a:

    struct molde_conta conta conta2;

    Na memria, as variveis dentro da struct so seqenciais, o nome da struct s o endereo da primeira posio de memria de tal struct, os elementos so as posies exatos do endereo de memria. Espero que todos estejam entendendo, essas definies de memria, posio e tal so altamente ligado aos conceitos de ponteiros.

    Podemos tambm declarar apenas a varivel do tipo struct, sem necessidade do seu molde. Teramos ento:

    struct {char nome[50]; int telefone;float saldo;} conta;

    Assim, temos a varivel conta, exatamente igual ao exemplo anterior. Isso til para quando no precisarmos de mais de uma vez, tal varivel.

    Utilizao do tipo

    Utilizamos um operador, chamado de operador ponto, para nos referenciar a struct. No exemplo acima, caso queiramos botar um valor no telefone, utilizamos:

    conta.telefone = 10;

    Sempre assim, nome_da_estrutura.nome_da_varivel, e assim a utilizamos como uma varivel comum, com exceo da especificao do nome da estrutura. Atravs desse tipo de referenciao, se faz o clculo automtico da posio de memria do elemento. Para uma string, podemos:

    strcpy(conta.nome,"meunomeentraaqui");

    Para contar o nmero de caracteres de nome dentro da estrutura conta, podemos fazer:

    for (i=0,conta.nome[i],++i) ;

    Page 39 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • printf ("o nome tem -> %d letras \n",i);

    A utilizao idntica. Muito fcil no?

    Podemos fazer atribuio de structs, do tipo conta2 = conta, e os valores sero idnticos. Um tipo bem utilizado em programao, so as matrizes de structs. Podemos pensar que um banco, precisa de um conjunto desse tipo de structs, claro que de forma muito mais complexa, para referenciar-se aos seus clientes. Teramos ento:

    struct molde_conta conta[100];

    Agora teremos um vetor do molde_conta (lembre-se da definio de molde l do comeo), cada um idntico que o conta tradicionalmente declarado l em cima, com exceo de seu identificador de posio.

    Union

    O tipo Union no ser muito discutido, pois vamos explic-lo de forma superficial. muito parecida sua utilizao com a de struct, como um caso dela, s que as variveis compartilham de uma mesma rea de memria. Por exemplo:

    union molde_indice{int numero;char caracter[2];};

    Aqui fazemos o mesmo que nas structs, declaramos o seu molde. Agora para utiliz-la:

    union molde_indice ndices;

    Agora quando eu desejo utilizar um dos elementos, normalmente fao: indices.numero, onde detenho desse elemento. O compilador sempre aloca o espao da maior varivel (no caso int = 2 bytes) para a unio completa. Parece no fazer muito sentido esse tipo, s que bastante interessante quando precisamos fazer converses de tipos de forma freqente. Temos como se fosse duas facetas de uma mesma posio de memria, de forma bem prtica. Quando queremos o nmero de forma do tipo caracter, dizemos indices.caracter[0] e temos a primeira parte do nmero, e com [1] da mesma forma.

    Se voc no entendeu muito bem dessa parte, sem problemas, no ser altamente aplicada no momento. Na hora mais conveniente, se necessrio, explicaremos de novo.

    Enum

    Enumeraes so associaes de inteiros com nomes, simplesmente por convenincia. Declaramos:

    enum molde_fruta { banana, maca, pera, uva, melancia, mamao, goiaba};enum molde_fruta fruta;

    Agora a varivel fruta pode receber um dos valores possveis do molde_fruta, que na verdade so inteiros seqenciais. S isso, importante frisar, enums so na verdade inteiros e no strings, so teis para facilitar a vida de quem est programando.

    Caso queiramos fazer um programa para uma feira, podemos nos referenciar atravs dos nomes das frutas e utiliz-las em todo programa, em vez de chamarmos a banana de 0, maca de 1, e assim por a. Podemos tambm fixar valores para os elementos de uma enum, atravs do sinal de igual e o valor, logo aps o tipo.

    bastante til tambm para ser ndice de uma string, que poder se referenciar aos nomes propriamente ditos que elas se chamam. Lembre-se, nunca podemos chegar e tentar utiliz-las como strings, elas so inteiros. Estou repetindo isso porque bem comum as pessoas fazerem confuso e no entenderem que s uma "mscara" para um valor inteiro.

    Page 40 of 125Curso de C - Olinux

    8/10/2010http://www.inf.pucrs.br/~celso/Curso%20de%20C.htm

  • Bem pessoal, isso, qualquer dvidas estamos a. A aula foi um pouco corrida, fiquem a vontade para dvidas. Ainda temos que falar de ponteiros mais a fundo, em relao a tudo que foi dito aqui e passagem de parmetros por referncia a funes.

    Aula 18Apresentao

    Respeitvel pblico que acompanha este curso de programao... tenho o imenso prazer de anunciar que, a partir de hoje, estarei escrevendo para vocs! Sou Cuco Verssimo, s vezes chamado pelo (verdadeiro) nome de Rodrigo Hausen, e espero poder ensinar a vocs vrias facetas e nuances do mundo do C. Apresentaes feitas, vamos ao que interessa!

    No cardpio desta semana teremos passagem de parmetros para funes, em dois sabores diferentes. Mas primeiro, va