Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Como programar em C // How to program, Exercícios de Programação em C

É um livro super didático. Oferece várias dicas para iniciantes.

Tipologia: Exercícios

2019
Em oferta
30 Pontos
Discount

Oferta por tempo limitado


Compartilhado em 04/08/2019

alissonjcjk
alissonjcjk 🇧🇷

4.5

(4)

1 documento

1 / 692

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Como
programar
Em
C
Paul J. Deitel e Harvey M. Deitel
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64
Discount

Em oferta

Pré-visualização parcial do texto

Baixe Como programar em C // How to program e outras Exercícios em PDF para Programação em C, somente na Docsity!

Como

programar

Em

C

Paul J. Deitel e Harvey M. Deitel

Índice

Capítulo 01 – Conceitos da Computação

Capítulo 02 – Introdução à programação em C

Capítulo 03 – Desenvolvimento da Programação Estruturada

Capítulo 04 – Controle do programa

Capítulo 05 – Funções

Capítulo 06 – Arrays

Capítulo 07 – Ponteiros

Capítulo 08 – Caracteres e strings

Capítulo 09 – Formatação de Entrada/Saída

Capítulo 10 – Estruturas, Uniões, Manipulações de Bits e Enumerações

Capítulo 11 – Processamento de arquivos

Capítulo 12 – Estrutura de dados

Capítulo 13 – O pré-processador

Apêndice A – Biblioteca-padrão

Apêndice B – Precedência de Operadores e Associatividade

Apêndice C – Conjunto de Caracteres ASCII

Apêndice D – Sistemas de numeração

Sumário

1.1 Introdução 1.2 O que É um Computador? 1.3 Organização dos Computadores 1.4 Processamento em Lotes (Batch Processing), Multiprogramação e Tempo Compartilha do (Timesharing) 1.5 Computação Pessoal, Computação Distribuída e Computação Cliente/Servidor 1.6 Linguagens de Máquina, Linguagens Assembly e Linguagens de Alto nível. 1.7 A História do C 1.8 A Biblioteca Padrão (Standard Library) do C 1.9 Outras Linguagens de Alto Nível 1.10 Programação Estruturada 1.11 Os Fundamentos do Ambiente C 1.12 Observações Gerais sobre o C e Este Livro 1.13 Concurrent C 1.14 Programação Orientada a Objetos e C+ +

Resumo - Terminologia - Práticas Recomendáveis de Programação - Dicas de Portabilidade - Dicas de Performance - Exercícios de Revisão - Respostas dos Exercícios de Revisão - Exercícios - Leitura Recomendada

1.1 Introdução

Bem-vindo ao C! Trabalhamos muito duro para criar o que sinceramente esperamos ser uma maneira instrutiva e divertida de aprendizado. O C é uma linguagem difícil, normalmente ensinada apenas para os programadores experientes, e, sendo assim, este livro não tem similar entre os livros-texto de C:

Este livro é aconselhável para pessoas interessadas em aspectos técnicos e com pouca ou nenhuma experiência de programação.

Este livro também é aconselhável para programadores experientes que desejam um tratamento profundo e rigoroso da linguagem.

Como um livro pode despertar o interesse de ambos os grupos? A resposta é que o tema central do livro coloca em destaque a obtenção de clareza nos programas através de técnicas comprovadas de programação estruturada. Quem não é programador aprenderá a programar "certo" desde o início. Tentamos escrever de uma maneira clara e simples. O livro contém muitas ilustrações. Talvez o aspecto mais importante seja o de que o livro apresenta um grande número de programas práticos em C e mostra as saídas produzidas quando eles forem executados em um computador.

Os quatro primeiros capítulos apresentam os fundamentos da computação, da programação de computadores e da linguagem de programação C. As análises estão inseridas em uma introdução à programação de computadores usando um método estruturado. Os principiantes em programação que fizeram nossos cursos nos informaram que o material desses capítulos apresenta uma base sólida para as técnicas mais avançadas da linguagem C. Normalmente os programadores experientes lêem rapidamente os quatro primeiros capítulos e então descobrem que o modo com o qual o assunto é tratado no Capítulo 5 é rigoroso e fascinante. Eles gostam particularmente da maneira detalhada como são analisados os ponteiros, strings, arquivos e estruturas de dados nos capítulos que se seguem.

Muitos programadores experientes nos disseram que aprovam nosso modo de apresentar a programação estruturada. Freqüentemente eles costumam programar em uma linguagem estruturada como o Pascal, mas, por nunca terem sido apresentados formalmente à programação estruturada, não escrevem o melhor código possível. À medida que aprenderem C com este livro, eles poderão aprimorar seu estilo de programação. Dessa forma, quer você seja um principiante, quer seja um programador experiente, há muito aqui para informá-lo, diverti-lo e estimulá-lo.

A maioria das pessoas está familiarizada com as coisas excitantes que os computadores fazem. Neste curso, você aprenderá a mandar os computadores fazerem essas coisas. É o software (i.e., as instruções escritas para mandar o computador realizar ações e tomar decisões) que controla os computadores (chamados freqüentemente de hardware), e uma das linguagens de desenvolvimento de software mais populares atualmente é o C. Este texto fornece uma introdução à programação em ANSI C, a versão padronizada em 1989 tanto nos EUA, através do American National Standards Institute (ANSI), como em todo o mundo, através da International Standards Organization (ISO).

1.2 O que É um Computador?

Um computador é um dispositivo capaz de realizar cálculos e tomar decisões lógicas com uma velocidade milhões ou mesmo bilhões de vezes mais rápida do que os seres humanos. Por exemplo, muitos dos computadores pessoais de hoje podem realizar dezenas de milhões de operações aritméticas por segundo. Uma pessoa utilizando uma calculadora de mesa poderia levar décadas para realizar o mesmo número de operações que um poderoso computador pessoal pode realizar em segundos. (Aspectos para reflexão: Como você saberia se a pessoa fez as operações corretamente? Como você saberia se o computador fez as operações corretamente?) Os mais rápidos supercomputadores de hoje podem realizar centenas de bilhões de operações por segundo — quase tantas operações quanto centenas de pessoas poderiam realizar em um ano! E os computadores que permitem trilhões de instruções por segundo já se encontram em funcionamento em laboratórios de pesquisa.

Os computadores processam dados sob o controle de conjuntos de instruções chamados programas de computador. Estes programas conduzem o computador através de um conjunto ordenado de ações especificado por pessoas chamadas programadores de computador.

Os vários dispositivos (como teclado, tela, discos, memória e unidades de processamento) que constituem um sistema computacional são chamados de hardware. Os programas executados em um computador são chamados de software. O custo do hardware diminuiu drasticamente nos últimos anos, chegando ao ponto de os computadores pessoais se tornarem uma utilidade. Infelizmente, o custo do desen- volvimento de software tem crescido constantemente, à medida que os programadores desenvolvem aplicações cada vez mais poderosas e complexas, sem serem capazes de fazer as melhorias correspondentes na tecnologia necessária para esse desenvolvimento. Neste livro você aprenderá métodos de desenvolvimento de software que podem reduzir substancialmente seus custos e acelerar o processo de desenvolvimento de aplicações poderosas e de alto nível. Estes métodos incluem programação estruturada, refinamento passo a passo top-down {descendente), funcionalização e, finalmente, pro- gramação orientada a objetos.

1.3 Organização dos Computadores

Independentemente das diferenças no aspecto físico, praticamente todos os computadores podem ser considerados como divididos em seis unidades lógicas ou seções. São elas:

  1. Unidade de entrada (input unit). Esta é a seção de "recepção" do computador. Ela obtém as informações (dados e programas de computador) dos vários dispositivos de entrada (input devices) e as coloca à disposição de outras unidades para que possam ser processadas. A maior parte das informações é fornecida aos computadores atualmente através de teclados como os de máquinas de escrever. 2. Unidade de saída (output unit). Esta é a seção de "expedição" do computador. Ela leva as informações que foram processadas pelo computador e as envia aos vários dispositivos de saída (output devices) para torná-las disponíveis para o uso no ambiente externo ao computador. A maioria das informações é fornecida pelo computador através de exibição na tela ou impressão em papel.
  2. Unidade de memória (memory unit). Este é a seção de "armazenamento" do computador, com acesso rápido e capacidade relativamente baixa. Ela conserva as informações que foram fornecidas através da unidade de entrada para que possam estar imediatamente disponíveis para o processamento quando se fizer necessário. A unidade de memória também conserva as informações que já foram processadas até que sejam enviadas para os dispositivos de saída pela unidade de saída. Freqüentemente a unidade de memória é chamada de memória (memory), memória principal ou memória primária (primary memory).
  3. Unidade aritmética e lógica (arithmetic and logic unit, ALU). Esta é a seção de "fabricação" do computador. Ela é a responsável pela realização dos cálculos como adição, subtração, multiplicação e divisão. Ela contém os mecanismos de decisão que permitem ao computador, por exemplo, comparar dois itens da unidade de memória para determinar se são iguais ou não.
  4. Unidade central de processamento, UCP (central processing unit, CPU). Esta é a seção "administrativa" do computador. Ela é o coordenador do computador e o responsável pela supervisão do funcionamento das outras seções. A CPU informa à unidade de entrada quando as informações devem ser lidas na unidade de memória, informa à ALU quando as informações da unidade de memória devem ser utilizadas em cálculos e informa à unidade de saída quando as informações devem ser enviadas da unidade de memória para determinados dispositivos de saída.
  5. Unidade de memória secundária (secondary storage unit). Esta é a seção de "armazenamento" de alta capacidade e de longo prazo do computador. Os programas ou dados que não estiverem sendo usados ativamente por outras unidades são colocados normalmente em dispositivos de memória secundária (como discos) até que sejam outra vez necessários, possivelmente horas, dias, meses ou até mesmo anos mais tarde.

1.5 Computação Pessoal, Computação Distribuída e

Computação Cliente/Servidor

Em 1997, a Apple Computer tornou popular o fenômeno da computação pessoal. Inicialmente, isto era um sonho de quem a tinha como um hobby. Computadores tornaram-se suficientemente baratos para serem comprados para uso pessoal ou comercial. Em 1981, a IBM, a maior vendedora de computadores do mundo, criou o IBM PC (Personal Computer, computador pessoal). Do dia para a noite, literalmente, a computação pessoal se tornou comum no comércio, na indústria e em organizações governamentais.

Mas esses computadores eram unidades "autônomas" — as pessoas faziam suas tarefas em seus próprios equipamentos e então transportavam os discos de um lado para outro para compartilhar as informações. Embora os primeiros computadores pessoais não fossem suficientemente poderosos para serem compartilhados por vários usuários, esses equipamentos podiam ser ligados entre si em redes de computadores, algumas vezes através de linhas telefônicas e algumas vezes em redes locais de organizações. Isto levou ao fenômeno da computação distribuída, na qual a carga de trabalho computacional de uma organização, em vez de ser realizada exclusivamente em uma instalação central de informática, é distribuída em redes para os locais (sites) nos quais o trabalho real da organização é efetuado. Os computadores pessoais eram suficientemente poderosos para manipular as exigências computacionais de cada usuário em particular e as tarefas básicas de comunicações de passar as informações eletronicamente de um lugar para outro.

Os computadores pessoais mais poderosos de hoje são tão poderosos quanto os equipamentos de milhões de dólares de apenas uma década atrás. Os equipamentos desktop (computadores de mesa) mais poderosos — chamados workstations ou estações de trabalho — fornecem capacidades enormes a usuários isolados. As informações são compartilhadas facilmente em redes de computadores onde alguns deles, os chamados servidores de arquivos (file servers), oferecem um depósito comum de programas e dados que podem ser usados pelos computadores clientes (clients) distribuídos ao longo da rede, daí o termo computação cliente/servidor. O C e o C ++ tornaram-se as linguagens preferidas de programação para a criação de software destinado a sistemas operacionais, redes de computadores e aplicações distribuídas cliente/servidor.

1.6 Linguagens de Máquina, Linguagens Assembly e

Linguagens de Alto Nível

Os programadores escrevem instruções em várias linguagens de programação, algumas entendidas diretamente pelo computador e outras que exigem passos intermediários de tradução. Centenas de linguagens computacionais estão atualmente em uso. Estas podem ser divididas em três tipos gerais:

**1. Linguagens de máquina

  1. Linguagens assembly
  2. Linguagens de alto nível**

Qualquer computador pode entender apenas sua própria linguagem de máquina. A linguagem de máquina é a "linguagem natural" de um determinado computador. Ela está relacionada intimamente com o projeto de hardware daquele computador. Geralmente as linguagens de máquina consistem em strings de números (reduzidos em última análise a ls e Os) que dizem ao computador para realizar uma de suas operações mais elementares de cada vez. As linguagens de máquina são dependentes de máquina (não-padronizadas, ou machine dependent), i.e., uma determinada linguagem de máquina só pode ser usada com um tipo de computador. As linguagens de máquina são complicadas para os humanos, como se pode ver no trecho seguinte de um programa em linguagem de máquina que adiciona o pagamento de horas extras ao salário base e armazena o resultado no pagamento bruto.

**+

+**

À medida que os computadores se tornaram mais populares, ficou claro que a programação em linguagem de máquina era simplesmente muito lenta e tediosa para a maioria dos programadores. Em vez de usar strings de números que os computadores podiam entender diretamente, os programadores começaram a usar abreviações parecidas com palavras em inglês para representar as operações elementares de um computador. Estas abreviações formaram a base das linguagens assembly. Foram desenvolvidos programas tradutores, chamados assemblers, para converter programas em linguagem assembly para linguagem de máquina na velocidade ditada pelo computador. O trecho de um programa em linguagem assembly a seguir também soma o pagamento de horas extras ao salário base e armazena o resultado em pagamento bruto, porém isto é feito de uma forma mais clara do que o programa equivalente em linguagem de máquina.

LOAD BASE ADD EXTRA STORE BRUTO

O uso do computador aumentou rapidamente com o advento das linguagens assembly, mas elas ainda exigiam muitas instruções para realizar mesmo as tarefas mais simples. Para acelerar o processo de programação, foram desenvolvidas linguagens de alto nível, nas quais podiam ser escritas instruções simples para realizar tarefas

1.7 A História do C

O C foi desenvolvido a partir de duas linguagens anteriores, o BCPL e o B. O BCPL foi desenvolvido em 1967 por Martin Richards como uma linguagem para escrever software de sistemas operacionais e compiladores. Ken Thompson modelou muitos recursos em sua linguagem B com base em recursos similares do BCPL e usou o B para criar as primeiras versões do sistema operacional UNIX nas instalações do Bell Laboratories em 1970, em um computador DEC PDP-7. Tanto o BCPL como o B eram linguagens "sem tipos" ("typeless") — todos os itens de dados ocupavam uma "palavra" na memória e a responsabilidade de lidar com um item de dados como um número inteiro ou real, por exemplo, recaía sobre os ombros do programador.

A linguagem C foi desenvolvida a partir do B por Dennis Ritchie, do Bell Laboratories, e implementada originalmente em um computador DEC PDP-11, em

  1. De início o C se tornou amplamente conhecido como a linguagem de desenvolvimento do sistema operacional UNIX. Hoje em dia, praticamente todos os grandes sistemas operacionais estão escritos em C e/ou C++. Ao longo das duas últimas décadas, o C ficou disponível para a maioria dos computadores. O C independe do hardware. Elaborando um projeto cuidadoso, é possível escrever programas em C que sejam portáteis para a maioria dos computadores. O C usa muitos dos importantes conceitos do BCPL e do B ao mesmo tempo que adiciona tipos de dados e outros recursos poderosos.

No final da década de 70, o C evoluiu e chegou ao que se chama agora de "C tradicional". A publicação em 1978 do livro de Kernighan e Ritchie, The C Programming Language, fez com que essa linguagem recebesse muita atenção. Esta publicação se tornou um dos livros de informática mais bem-sucedidos de todos os tempos.

A rápida expansão do C em vários tipos de computadores (algumas vezes chamados de plataformas de hardware) levou a muitas variantes. Elas eram similares, mas freqüentemente incompatíveis. Isto foi um problema sério para os desenvolvedores de programas que precisavam criar um código que fosse executado em várias plataformas. Ficou claro que era necessário uma versão padrão do C. Em 1983, foi criado o comitê técnico X3J11 sob o American National Standards Committee on Computers and Information Processing (X3) para "fornecer à linguagem uma definição inequívoca e independente de equipamento". Em 1989, o padrão foi aprovado. O documento é conhecido como ANSI/ISO 9899:1990. Pode-se pedir cópias desse documento para o American National Standards Institute, cujo endereço consta no Prefácio a este texto. A segunda edição do livro de Kernighan e Ritchie, publicada em 1988, reflete esta versão, chamada ANSI C, agora usada em todo o mundo (Ke88).

Dicas de portabilidade 1.

Como o C é uma linguagem independente de hardware e amplamente disponível, as aplicações escritas em C podem ser executadas com pouca ou nenhuma modificação em uma grande variedade de sistemas computacionais.

1.8 A Biblioteca Padrão (Standard Library) do C

Como você aprenderá no Capítulo 5, os programas em C consistem em módulos ou elementos chamados funções. Você pode programar todas as funções de que precisa para formar um programa C, mas a maioria dos programadores C tira proveito de um excelente conjunto de funções chamado C Standard Library (Biblioteca Padrão do C). Dessa forma, há na realidade duas partes a serem aprendidas no "mundo" do C. A primeira é a linguagem C em si, e a segunda é como usar as funções do C Standard Library. Ao longo deste livro, analisaremos muitas dessas funções. O Apêndice A (condensado e adaptado do documento padrão do ANSI C) relaciona todas as funções disponíveis na biblioteca padrão do C. A leitura do livro de Plauger (P192) é obrigatória para os programadores que necessitam de um entendimento profundo das funções da biblioteca, de como implementá-las e como usá-las para escrever códigos portáteis.

Neste curso você será estimulado a usar o método dos blocos de construção para criar programas. Evite reinventar a roda. Use os elementos existentes — isto é chamado reutilização de software e é o segredo do campo de desenvolvimento da programação orientada a objetos. Ao programar em C, você usará normalmente os seguintes blocos de construção:

  • Funções da C Standard Library (biblioteca padrão)
  • Funções criadas por você mesmo
  • Funções criadas por outras pessoas e colocadas à sua disposição

A vantagem de criar suas próprias funções é que você saberá exatamente como elas funcionam. Você poderá examinar o código C. A desvantagem é o esforço demorado que se faz necessário para projetar e desenvolver novas funções.

Usar funções existentes evita reinventar a roda. No caso das funções standard do ANSI, você sabe que elas foram desenvolvidas cuidadosamente e sabe que, por estar usando funções disponíveis em praticamente todas as implementações do ANSI C, seus programas terão uma grande possibilidade de serem portáteis.

Dica de desempenho 1.

Usar as funções da biblioteca standard do C em vez de você escrever suas próprias versões similares pode melho¬rar o desempenho do programa porque essas funções foram desenvolvidas cuidadosamente por pessoal eficiente.

Dicas de portabilidade 1.

Usar as funções da biblioteca padrão do C em vez de escrever suas próprias versões similares pode melhorar a porta¬bilidade do programa porque essas funções estão colocadas em praticamente todas as implementações do ANSI C.

1.10 Programação Estruturada

Durante os anos 60, enormes esforços para o desenvolvimento de software encontraram grandes dificuldades. Os cronogramas de desenvolvimento de software normalmente estavam atrasados, os custos superavam em muito os orçamentos e os produtos finais não eram confiáveis. As pessoas começaram a perceber que o desenvolvimento era uma atividade muito mais complexa do que haviam imaginado. A atividade de pesquisa dos anos 60 resultou na evolução da programação estruturada — um método disciplinado de escrever programas claros, nitidamente corretos e fáceis de modificar. Os Capítulos 3 e 4 descrevem os fundamentos da programação estruturada. O restante do texto analisa o desenvolvimento de programas em C estruturados.

Um dos resultados mais tangíveis dessa pesquisa foi o desenvolvimento da linguagem Pascal de programação pelo Professor Nicklaus Wirth em 1971. O Pascal, que recebeu este nome em homenagem ao matemático e filósofo Blaise Pascal, que viveu no século XVII, destinava-se ao ensino da programação estruturada em ambientes acadêmicos e se tornou rapidamente a linguagem preferida para a introdução à programação em muitas universidades. Infelizmente, a linguagem carecia de muitos recursos necessários para torná-la útil em aplicações comerciais, industriais e governamentais, e portanto não foi amplamente aceita nesses ambientes. Possivelmente a história registra que a grande importância do Pascal foi sua escolha para servir de base para a linguagem de programação Ada.

A linguagem Ada foi desenvolvida sob a responsabilidade do Departamento de Defesa dos EUA (United States Department of Defense, ou DOD) durante os anos 70 e início dos anos 80. Centenas de linguagens diferentes estavam sendo usadas para produzir os imensos sistemas de comando e controle de software do DOD. O DOD desejava uma única linguagem que pudesse atender a suas necessidades. O Pascal foi escolhido como base, mas a linguagem Ada final é muito diferente do Pascal. A linguagem Ada recebeu este nome em homenagem a Lady Ada Lovelace, filha do poeta Lorde Byron. De uma maneira geral, Lady Lovelace é considerada a primeira pessoa do mundo a escrever um programa de computador, no início do século XIX. Uma característica importante da linguagem Ada é chamada multitarefa (multitasking); isto permite aos programadores especificarem a ocorrência simultânea de muitas atividades. Outras linguagens de alto nível amplamente usadas que analisamos — incluindo o C e o C++ — permitem ao programador escrever programas que realizem apenas uma atividade. Saberemos no futuro se a linguagem Ada conseguiu atingir seus objetivos de produzir software confiável e reduzir substancialmente os custos de desenvolvimento e manutenção de software.

1.11 Os Fundamentos do Ambiente C

Todos os sistemas C são constituídos geralmente de três partes: o ambiente, a linguagem e a C Standard Library. A análise a seguir explica o ambiente típico de desenvolvimento do C, mostrado na Figura 1.1.

Normalmente os programas em C passam por seis fases para serem executados (Figura 1.1). São elas: edição, pré-processamento, compilação, linking (ligação), carregamento e execução. Concentrar-nos-emos aqui em um sistema típico do C baseado em UNIX. Se você não estiver usando um sistema UNIX, consulte o manual de seu sistema ou pergunte ao seu professor como realizar estas tarefas em seu ambiente.

A primeira fase consiste na edição de um arquivo. Isto é realizado com um programa editor. O programador digita um programa em C com o editor e faz as correções necessárias. O programa é então armazenado em um dispositivo de armazenamento secundário como um disco. Os nomes de programas em C devem ter a extensão .c. Dois editores muito usados em sistemas UNIX são o vi e o emacs. Os pacotes de software C/C++ como o Borland C++ para IBM PCs e compatíveis e o Symantec C++ para Apple Macintosh possuem editores embutidos que se adaptam perfeitamente ao ambiente de programação. Partimos do princípio de que o leitor sabe editar um programa.

A seguir, o programador emite o comando de compilar o programa. O compilador traduz o programa em C para o código de linguagem de máquina (também chamado de código-objeto). Em um sistema C, um programa pré-processador é executado automaticamente antes de a fase de tradução começar. O pré-processador C obedece a comandos especiais chamados diretivas do pré-processador que indicam que devem ser realizadas determinadas manipulações no programa antes da compilação. Estas manipulações consistem normalmente em incluir outros arquivos no arquivo a ser compilado e substituir símbolos especiais por texto de programa. As diretivas mais comuns do pré-processador são analisadas nos primeiros capítulos; uma análise detalhada de todos os recursos do pré-processador está presente no Capítulo 13. O pré- processador é ativado automaticamente pelo compilador antes de o programa ser convertido para linguagem de máquina.

A quarta fase é chamada linking. Normalmente os programas em C contêm referências a funções definidas em outros locais, como nas bibliotecas padrão ou nas bibliotecas de um grupo de programadores que estejam trabalhando em um determinado projeto. Assim, o código-objeto produzido pelo compilador C contém normalmente "lacunas" devido à falta dessas funções. Um linker faz a ligação do código-objeto com o código das funções que estão faltando para produzir uma imagem executável (sem a falta de qualquer parte). Em um sistema típico baseado em UNIX, o comando para compilar e linkar um programa é cc. Por exemplo, para compilar e linkar um programa chamado bemvindo. c digite

cc bemvindo.c

1.12 Observações Gerais sobre o C e Este Livro

O C é uma linguagem difícil. Algumas vezes, os programadores experientes ficam orgulhosos de criar utilizações estranhas, distorcidas e complicadas da linguagem. Isto é uma péssima regra de programação. Ela faz com que os programas fiquem difíceis de ler, com grande probabilidade de se comportarem de maneira imprevista e mais difíceis de testar e depurar erros. Este livro se destina a programadores iniciantes, portanto damos ênfase à elaboração de programas claros e bem-estruturados. Um de nossos objetivos principais neste livro é fazer com que os programas fiquem claros através da utilização de técnicas comprovadas de programação estruturada e das muitas práticas recomendáveis, de programarão mencionadas.

Boas práticas de programação 1.

Escreva seus programas em C de uma maneira simples e objetiva. Algumas vezes isto é chamado KIS (do inglês "keep it simple" [que pode ser traduzido por "mantenha a simplicidade"]). Não "complique" a linguagem tentando soluções "estranhas".

Você pode ouvir que o C é uma linguagem portátil e que os programas escritos em C podem ser executados em muitos computadores diferentes. A portabilidade é um objetivo ilusório. O documento padrão do ANSI (An90) lista 11 páginas de questões delicadas sobre portabilidade. Foram escritos livros completos sobre o assunto de portabilidade no C (Ja89) (Ra90).

Dicas de portabilidade 1.

Embora seja possível escrever programas portáteis, há muitos problemas entre as diferentes implementa¬ções do C e os diferentes computadores que tornam a portabilidade um objetivo difícil de atingir. Simples¬mente escrever programas em C não garante a portabilidade.

Fizemos uma pesquisa cuidadosa do documento padrão do ANSI C e examinamos nossa apresentação quanto aos aspectos de completude e precisão. Entretanto, o C é uma linguagem muito rica e possui algumas sutilezas e alguns assuntos avançados que não analisamos. Se você precisar conhecer detalhes técnicos adicionais sobre o ANSI C, sugerimos a leitura do próprio documento padrão do ANSI C ou o manual de referência de Kernighan e Ritchie (Ke88).

Limitamos nosso estudo ao ANSI C. Muitos recursos do ANSI C não são compatíveis com implementações antigas do C, portanto você pode vir a descobrir que alguns programas mencionados neste texto não funcionam com compiladores antigos do C.

Boas práticas de programação 1.

Leia os manuais da versão do C que estiver usando. Consulte freqüentemente estes manuais para se certificar do conhecimento do rico conjunto de recursos do C e de que eles estão sendo usados corretamente.

Boas práticas de programação 1.

Seu computador e compilador são bons mestres. Se você não estiver certo de como funciona um recurso do C, escreva um programa de teste que utilize aquele recurso, compile e execute o programa, e veja o que acontece.