Programa¸
c˜
ao de Computadores
em C
Primeira edi¸
c˜
ao
Carlos Camar˜
ao
Universidade Federal de Minas Gerais
Doutor em Ciˆencia da Computa¸c˜ao pela Universidade de Manchester, Inglaterra
Luc´ılia Figueiredo
Universidade Federal de Ouro Preto
Doutora em Ciˆencia da Computa¸c˜ao pela UFMG
Direitos exclusivos
Copyright c 2009 by Carlos Camar˜ao e Luc´ılia Figueiredo ´
E permitida a duplica¸c˜ao ou reprodu¸c˜ao deste volume, no todo ou em parte, sob quaisquer formas ou por quaisquer meios (eletrˆonico, mecˆanico, grava¸c˜ao, fotoc´opia, distribui¸c˜ao na Web ou outros), desde que seja para fins n˜ao comerciais.
Sum´
ario
Pref´acio vii
Pref´
acio
Este livro se prop˜oe a acompanh´a-lo no in´ıcio de um longo caminho, que ´e o do desenvolvi-mento do racioc´ınio necess´ario para constru¸c˜ao de programas bem feitos. Para isto, o livro aborda conceitos b´asicos de programa¸c˜ao de computadores, de forma que posteriormente assuntos mais avan¸cados possam ser abordados.
Conte´
udo e Organiza¸
c˜
ao do Livro
Este livro foi concebido para ser utilizado como texto did´atico em cursos introdut´orios de programa¸c˜ao, de n´ıvel universit´ario. O conte´udo do livro n˜ao pressup˜oe qualquer conhecimento ou experiˆencia pr´evia do leitor em programa¸c˜ao, ou na ´area de computa¸c˜ao em geral, requerendo apenas conhecimentos b´asicos de matem´atica, usualmente abordados nos cursos de primeiro e segundo graus. O livro adota a linguagem de programa¸c˜ao C (veja no anexo A uma discuss˜ao sobre essa escolha).
Como estudaremos daqui a pouco, a linguagem C ´e uma linguagem imperativa. Uma vis˜ao geral sobre os conceitos b´asicos da programa¸c˜ao imperativa ´e apresentada inicialmente, com o objetivo de favorecer uma compreens˜ao global sobre o significado e o prop´osito dos conceitos empregados nesse estilo de programa¸c˜ao, facilitando assim um melhor entendimento da aplica¸c˜ao dos mesmos na constru¸c˜ao de programas. Cada um desses conceitos ´e abordado mais detalhadamante em cap´ıtulos subsequentes, por meio de exemplos ilustrativos e exerc´ıcios.
Al´em desses conceitos b´asicos, o livro aborda tamb´em, de maneira introdut´oria, os seguintes t´opicos adicionais: entrada e sa´ıda de dados em arquivos, e manipula¸c˜ao de estruturas de dados como arranjos e listas encadeadas.
Recursos Adicionais
Uma p´agina na Internet associada a este livro pode ser encontrada no endere¸co: http://www.dcc.ufmg.br/~camarao/ipcc
O texto desse livro e os c´odigos da maioria dos programas apresentados no livro como exemplos encontram-se dispon´ıveis nesta p´agina. Outros recursos dispon´ıveis incluem sugest˜oes de exerc´ıcios adicionais e projetos de programa¸c˜ao, transparˆencias para uso em cursos baseados neste livro e referˆencias para outras p´aginas da Internet que contˆem informa¸c˜oes sobre a linguagem C ou sobre ferramentas para programa¸c˜ao nessa linguagem.
H´a diversas p´aginas na Web com informa¸c˜oes sobre a linguagem C dispon´ıveis na Web, assim como cursos sobre introdu¸c˜ao a prgrama¸c˜ao em C, dentre os quais citamos:
• http://pt.wikibooks.org/wiki/Programar em C: P´aginas Wiki, criadas pela pr´opria co-munidade de usu´arios da Web, sobre programa¸c˜ao em C. A vers˜ao em inglˆes pode ser encon-trada em http://en.wikipedia.org/wiki/C (programming language).
• http://www.ead.cpdee.ufmg.br/cursos/C: Material usado no curso de introdu¸c˜ao a pro-grama¸c˜ao em C ministrado no Departamento de Engenharia El´etrica da UFMG.
• http://cm.bell-labs.com/cm/cs/cbook/: The C Programming Language, B. Kernighan & Dennis M. Ritchie, Prentice Hall, 1988.
viii Pref´acio
• http://publications.gbdirect.co.uk/c book/: P´agina com a vers˜ao gratuita da segunda edi¸c˜ao do livro The C Book , de Mike Banahan, Declan Brady e Mark Doran, publicado pela Addison Wesley em 1991.
• http://www.cyberdiem.com/vin/learn.html: Learn C/C++ today, de V. Carpenter. Uma cole¸c˜ao de referˆencias e tutoriais sobre as linguagens C e C++ dispon´ıveis na Internet. • http://c-faq.com/index.html: Perguntas frequentes sobre a linguagem C, e suas respostas
(em inglˆes).
• http://cm.bell-labs.com/cm/cs/who/dmr/chist.html: “The Development of the C Lan-guage”, Dennis M. Ritchie (Janeiro de 1993).
• http://www.livinginternet.com/i/iw unix c.htm: “History of the C Programming Lan-guage”, Bill Stewart (Janeiro de 2000).
• http://www.cs.ucr.edu/ nxiao/cs10/errors.htm: “10 Common Programming Mistakes in C”.
Livros adicionais sobre a linguagem C incluem:
• A linguagem de programa¸c˜ao padr˜ao ANSI C . B. Kernighan & D.C. Ritchie. Editora Cam-pus, 1990.
• C — completo e total. H. Schildt. Editora McGraw-Hill, 1990.a • C: A Reference Manual , Samuel P. Harbison & Guy L. Steele, 5a
edi¸c˜ao, Prentice Hall, 2002. • C Programming: A Modern Approach, K.N. King, Norton, 2008.
E divirta-se assistindo:
Referˆ
encias Bibliogr´
aficas
[1] Andrew Tanenbaum. Organiza¸c˜ao Estruturada de Computadores. LTC (tradu¸c˜ao), 2001. [2] Cordelia Hall, John O’Donnell. Discrete Mathematics Using a Computer. Springer, 2000. [3] David Patterson, John Hennessy. Computer Organization and Design: The Hardware Sofwtare
Interface. Morgan Kaufmann, 2a
edition, 2002.
[4] Keith Devlin. Mathematics: The New Golden Age. Penguin Books & Columbia University Press, 1999.
[5] Roger Penrose. The Emperor’s New Mind: Concerning Computers, Minds and The Laws of Physics. Oxford University Press, 1989.
[6] Michael Sipser. Introduction to the Theory of Computation. PWS Publishing Company, 1997. [7] Daniel Velleman. How to Prove It: A Structured Approach. Cambridge University Press, 2a
edition, 2006.
[8] William Stallings. Arquitetura e Organiza¸c˜ao de Computadores: Projeto para o Desempenho. Pearson Education do Brasil (tradu¸c˜ao), 5a
Apˆ
endice A
Escolha da linguagem C
O livro adota a linguagem de programa¸c˜ao C. A escolha dessa linguagem foi motivada pela neces-sidade de homogeneiza¸c˜ao no ensino de disciplinas introdut´orias de programa¸c˜ao de computadores nos cursos de v´arias universidades (por exemplo, nas disciplinas de Algoritmos e Estruturas de Dados I do Departamento de Ciˆencia da Computa¸c˜ao da Universidade Federal de Minas Gerais). O uso da linguagem C apresenta, reconhecidamente, vantagens no ensino de tais disciplinas para cursos como os de Engenharia El´etrica e Engenharia de Controle e Automa¸c˜ao, por se tratar de linguagem adequada `a chamada programa¸c˜ao de sistemas, na qual se faz acesso direto a disposi-tivos e recursos de hardware. Para tais sistemas, a programa¸c˜ao na linguagem C ´e adequada pois a linguagem permite acesso direto aos dispositivos e recursos de hardware, e portanto bibliotecas e programas que fazem tais acessos diretos ao hardware podem ser mais facilmente encontrados e usados. Para outros cursos, o uso da linguagem C ´e controverso, pelo fato de existir na linguagem uma preocupa¸c˜ao central com eficiˆencia, e possibilidade de acesso direto a ´areas de mem´oria, o que leva, principalmente, a duas consequˆencias indesej´aveis do ponto de vista de um aprendizado em programa¸c˜ao:
1. Ausˆencia, em muitos casos, de verifica¸c˜ao dos chamados erros de tipo. Tais erros ocorrem devido ao uso de valores em contextos inadequados, ou seja, em contextos nos quais n˜ao faz sentido usar tais valores, e portanto nos quais tais valores n˜ao deveriam ser usados.
Grande parte do desenvolvimento das linguagens de programa¸c˜ao nos dias atuais ´e rela-cionado ao objetivo de tornar as linguagens cada vez mais seguras, no sentido de possibilitar a dete¸c˜ao de um n´umero cada vez maior de erros de tipo, e ao mesmo tempo dando flexi-bilidade ao programador, de modo que ele n˜ao tenha que especificar ou mesmo se preocupar com a anota¸c˜ao expl´ıcita de tipos em seus programas, e procurando manter o algoritmo que permite essa dete¸c˜ao de erros simples e eficiente.
2. Mecanismos adequados na linguagem para suporte a abstra¸c˜oes, conceitos e constru¸c˜oes comumente usados em programas, de forma simples e segura. Exemplos de tais mecanismos s˜ao:
• Tipos alg´ebricos: tipos que permitem representar disjun¸c˜ao (“ou”) entre tipos e estru-turas de dados, de modo seguro e simples. Tipos alg´ebricos s˜ao usados comumente, para representar estruturas muito comuns em computa¸c˜ao, tais como:
– enumera¸c˜oes, denotadas por tipos que consistem em uma enumera¸c˜ao de todos os poss´ıveis elementos do tipo, como por exemplo um tipo booleano (cada valor consistindo de falso ou verdadeiro), ou esta¸c˜oes do ano (primavera, ver˜ao, outono ou inverno), etc.;
– alternativas que estendem enumera¸c˜oes de modo a permitir diferentes modos de construir valores, tal como por exemplo uma forma geom´etrica, que pode ser um c´ırculo com o tamanho de seu raio, ou um retˆangulo com os tamanhos de seus dois lados etc.
– estruturas recursivas que estendem alternativas por permitir recursividade na sua defini¸c˜ao, como por exemplo uma lista, que pode ser vazia ou um elemento seguido
4 Escolha da linguagem C
do restante da lista (tal restante consistindo, recursivamente, de uma lista), uma ´arvore bin´aria, que pode ser uma folha contendo um valor de um determinado tipo ou um par formado por duas sub´arvores, etc.;
• Polimorfismo: tanto de valores (estruturas de dados) que podem ser instanciados para quaisquer tipos, mantendo a mesma forma, quanto de fun¸c˜oes que realizam opera¸c˜oes sobre tais estruturas de dados, que funcionam do mesmo modo, independentemente da instˆancia sobre a qual realizam a opera¸c˜ao.
A ausˆencia de suporte a polimorfismo em C impede, em particular, que existam bibliote-cas com fun¸c˜oes de manipula¸c˜ao de estruturas de dados de prop´osito geral como pilhas, filas, dicion´arios, conjuntos etc., comuns em linguagens mais modernas.
Leitores interessados em tais assuntos podem consultar as notas bibliogr´aficas do Cap´ıtulo ??. Em conclus˜ao, existe um compromisso entre a inten¸c˜ao de formar durante o tempo da gradua¸c˜ao um programador pronto para as necessidades da ind´ustria e o objetivo did´atico primordial que consiste em oferecer uma forma¸c˜ao s´olida aos graduandos nos aspectos te´oricos relacionados `a programa¸c˜ao de computadores. Pelo primeiro motivo, este livro foi escrito na linguagem C. Pelo segundo, se oferecem se¸c˜oes especiais que abordam temas destinados aos estudantes que procurem maior aprofundamento nos conte´udos lecionados.