




























































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
É um livro super didático. Oferece várias dicas para iniciantes.
Tipologia: Exercícios
Oferta por tempo limitado
Compartilhado em 04/08/2019
4.5
(4)1 documento
1 / 692
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































Em oferta
Índice
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.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
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
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:
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
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.