Resumo | Terminologia | Exercícios de revisão | Respostas dos exercícios de revisão | Exercícios
1.1 Introdução
Bem-vindo ao C++! Trabalhamos muito para criar o que esperamos que você julgue ser uma experiência de aprendizagem informativa, divertida e desafiante. O C++ é uma poderosa linguagem de programação de computador apropriada para pessoas tecnicamente orientadas com pouca ou nenhuma experiência em programação e para programadores experientes utilizaremna construção de substanciais sistemas de informações. C++ Como programar, Quinta edição, é uma ferramenta de aprendizagem eficaz para cada uma dessas audiências.
A essência do livro enfatiza como alcançar clareza de programa por meio de comprovadas técnicas de programação orientada a objetos — este é um livro de ‘classes e objetos desde o início’ — e os não-programadores aprenderão a programação de maneira certa desde o início. A apresentação é clara, direta e abundantemente ilustrada. Ensinamos os recursos do C++ no contexto de programas C++ funcionais completos e mostramos as saídas produzidas quando esses programas são executados em um computador — chamamos isso de abordagem live-code (código ativo). Os programas de exemplo são incluídos no CD que acompanha este livro ou você pode fazer download desses programas em www.deitel.com ou www.prenhall.com/deitel.
Os primeiros capítulos introduzem os princípios básicos sobre computadores, programação de computadores e a linguagem de pro- gramação de computadores em C++, fornecendo uma base sólida para o tratamento mais profundo do C++ nos capítulos posteriores. Programadores experientes tendem a ler os primeiros capítulos rapidamente e, então, acham o tratamento de C++ no restante do livro tanto rigoroso como desafiador.
A maioria das pessoas está familiarizada de alguma maneira com as coisas empolgantes que os computadores fazem. Utilizando este livro-texto, você aprenderá a comandar computadores para fazer essas coisas. Os computadores (freqüentemente referidos como hardware) são controlados por software (isto é, as instruções que você escreve para instruir o computador a realizar ações e tomar decisões). O C++ é uma das mais populares linguagens de desenvolvimento de software atualmente. Este texto fornece uma introdução à programação na versão de C++ padronizada nos Estados Unidos pelo American National Standards Institute (ANSI) e em todo o mundo pelos esforços da International Organization for Standardization (ISO).
O uso de computadores está aumentando em quase todos os campos de trabalho. Os custos de computação têm diminuído radi- calmente por causa do rápido desenvolvimento em tecnologia de hardware e software. Os computadores que ocupavam grandes salas e custavam milhões de dólares há algumas décadas agora podem ser gravados em chips de silício menores que uma unha, ao custo de apenas alguns poucos dólares. (Aqueles computadores grandes eram chamados de mainframes e são amplamente utilizados hoje em negócios, órgãos do governo e na indústria.) Felizmente, o silício é um dos materiais mais abundantes na terra — é um ingrediente da areia comum. A tecnologia do chip de silício tornou a computação tão econômica que um bilhão de computadores de uso geral estão em utilização em todo o mundo, auxiliando pessoas no comércio, indústria, governo e na vida pessoal.
Ao longo dos anos, muitos programadores aprenderam a metodologia de programação chamada programação estruturada. Você apren- derá a programação estruturada e uma estimulante e mais recente metodologia, a programação orientada a objetos. Por que ensinamos
Deitel_C++_Cap01.indd 2
3
ambas? Atualmente, a orientação a objeto é a metodologia de programação chave utilizada pelos programadores. Você criará e trabalhará com muitos objetos de software neste texto. Entretanto, descobrirá que sua estrutura interna é muitas vezes construída com técnicas de programação estruturada. Além disso, a lógica de manipular objetos é ocasionalmente expressa com programação estruturada.Você está embarcando em um caminho desafiante e recompensador. À medida que avança, se você tiver qualquer dúvida, envie um e-mail para
Responderemos prontamente. Para manter-se atualizado com o desenvolvimento do C++ na Deitel & Associates, assine nosso boletim gratuito de correio eletrônico, The Deitel Buzz Online, em
www.deitel.com/newsletter/subscribe.html
Esperamos que você goste de aprender com C++ Como programar, Quinta edição.
1.2 O que é um computador?
Um computador é um dispositivo capaz de realizar computações e tomar decisões lógicas milhões e (até bilhões) de vezes mais rapi- damente que o homem. Por exemplo, muitos computadores pessoais de hoje podem realizar um bilhão de adições por segundo. Uma pessoa operando uma calculadora de mesa pode gastar a vida toda para fazer cálculos e ainda não concluir a mesma quantidade de cálculos que um poderoso computador pessoal pode realizar em um segundo! (Questões a ponderar: Como você saberia se a pessoa somou os números corretamente? Como você saberia se o computador somou os números corretamente?) Os supercomputadores mais rápidos de hoje podem realizar trilhões de adições por segundo!
Os computadores processam dados sob o controle de conjuntos de instruções chamados programas de computador. Esses pro- gramas orientam o computador por meio de conjuntos ordenados de ações especificadas por pessoas chamadas programadores de computador.
Um computador consiste em vários dispositivos referidos como hardware (por exemplo, o teclado, a tela, o mouse, o disco rígido, a memória, os DVDs e as unidades de processamento). Os programas que executam em um computador são referidos como software. Os custos de hardware têm caído significativamente nos últimos anos, a ponto de os computadores pessoais terem se tornado um bem de consumo popular. Neste livro, você aprenderá métodos comprovados que estão reduzindo custos de desenvolvimento de software — a programação orientada a objetos e (em nosso Estudo de caso opcional de engenharia de software nos capítulos 2–7, 9 e 13) o projeto orientado a objetos.
1.3 Organização do computador
Independentemente das diferenças na aparência física, praticamente todos os computadores podem ser considerados como divididos em seis unidades lógicas ou seções.
1. Unidade de entrada. Esta é a seção ‘receptora’ do computador. Ele obtém informações (dados e programas de computador) de dispositivos de entrada e coloca essas informações à disposição das outras unidades para processamento. A maioria das informações é inserida em computadores por meio de dispositivos de entrada, como teclados e mouse. As informações também podem ser inseridas de muitas outras maneiras, incluindo falar com seu computador, digitalizar imagens e fazer seu computador receber informações de uma rede, como a Internet.
2. Unidade de saída. Esta é a seção de ‘envio’ do computador. Ela pega as informações que o computador processou e as co- loca em vários dispositivos de saída para tornar as informações disponíveis à utilização fora do computador. A maioria das informações enviadas para a saída de computadores é exibida em telas, impressas em papel ou utilizadas para controlar outros dispositivos. Os computadores também podem gerar saída de suas informações para redes, como a Internet.
3. Unidade de memória. Esta é a seção de armazenamento de relativamente baixa capacidade e rápido acesso do computador. Ela armazena programas de computador enquanto estão sendo executados. Retém informações que foram inseridas pela uni- dade de entrada, para se tornarem imediatamente disponíveis para processamento quando necessário. A unidade de memória também retém informações processadas até que elas possam ser colocadas em dispositivos de saída pela unidade de saída. As informações na unidade de memória são, em geral, perdidas quando o computador é desligado. A unidade de memória costuma ser chamada de memória ou memória principal. [Historicamente, essa unidade era chamada de ‘memória básica’, mas o uso desse termo está desaparecendo gradualmente hoje.]
4. Unidade de aritmética e lógica (arithmetic and logic unit – ALU). Esta é a seção de ‘produção’ do computador. Ela é responsável pela realização de cálculos, como adição, subtração, multiplicação e divisão. 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. 5. Unidade central de processamento (central processing unit – CPU). Esta é a seção ‘administrativa’ do computador. Ela
coordena e supervisiona a operação das outras seções. A CPU diz à unidade de entrada quando as informações devem ser lidas e transferidas para a unidade de memória, informa à ALU quando as informações da unidade de memória devem ser utilizadas em cálculos e instrui a unidade de saída sobre quando enviar as informações da unidade de memória para certos dispositivos de
1.2 O que é um computador?
Deitel_C++_Cap01.indd 3
saída. Muitos computadores de hoje têm múltiplas CPUs e, portanto, podem realizar muitas operações simultaneamente — esses computadores são chamados de multiprocessadores.
6. Unidade de armazenamento secundária. Esta é a seção de armazenamento de alta capacidade e longo prazo do computador. Programas ou dados que não são utilizados ativamente pelas outras unidades, em geral, são colocados em dispositivos de ar- mazenamento secundário, como as unidades de disco, até que sejam novamente necessários, possivelmente horas, dias, meses ou mesmo anos mais tarde. As informações no armazenamento secundário exigem muito mais tempo para serem acessadas do que as informações na memória principal, mas o custo por unidade de armazenamento secundário é muito menor que o da memória principal. Outros dispositivos de armazenamento secundários incluem CDs e DVDs, que podem armazenar centenas de milhões de caracteres e bilhões de caracteres, respectivamente.
1.4 Primeiros sistemas operacionais
Os primeiros computadores podiam realizar apenas um trabalho ou tarefa por vez. Isso costuma ser chamado de processamento em lotes de um único usuário. O computador executa um único programa por vez enquanto está processando dados em grupos ou lotes. Nesses antigos sistemas, os usuários geralmente enviavam os trabalhos para um centro de processamento de dados em maços de cartões perfurados e, com freqüência, tinham de esperar horas ou até mesmo dias antes de as impressões retornarem para suas mesas.
Os sistemas de software chamados sistemas operacionais foram desenvolvidos para tornar a utilização de computadores mais conveniente. Os primeiros sistemas operacionais tornaram a transição entre trabalhos mais suave e mais rápida e, portanto, aumentaram a quantidade de trabalho, ou throughput, que os computadores poderiam processar.
Quando os computadores se tornaram mais poderosos, ficou evidente que o processamento em lotes de um único usuário era inefi- ciente, porque uma grande quantidade tempo era gasta esperando dispositivos de entrada/saída lentos completarem suas tarefas. Pensou-se que muitos trabalhos ou tarefas poderiam compartilhar os recursos do computador para alcançar melhor utilização. Isso é alcançado pela multiprogramação. A multiprogramação envolve a operação simultânea de muitos trabalhos que competem para compartilhar os recursos do computador. Com os primeiros sistemas operacionais baseados em multiprogramação, os usuários ainda submetiam trabalhos em unidades de cartões perfurados e esperavam horas ou dias para resultados.
Na década de 1960, vários grupos na indústria e nas universidades foram os pioneiros dos sistemas operacionais de compartilha- mento de tempo. O compartilhamento de tempo é um caso especial da multiprogramação em que usuários acessam o computador por meio de terminais, em geral dispositivos com teclados e telas. Dúzias ou até mesmo centenas de usuários compartilham o computador de uma vez. Na verdade, o computador não executa todos eles simultaneamente. Em vez disso, executa uma pequena parte do trabalho de um usuário e, em seguida, atende o próximo usuário, talvez fornecendo serviço para cada usuário várias vezes por segundo. Portanto, os programas dos usuários parecem estar executando simultaneamente. Uma vantagem do compartilhamento de tempo é que as solicitações de usuários recebem respostas quase imediatas.
1.5 Computação pessoal distribuída e computação cliente/servidor
Em 1977, a Apple Computer popularizou a computação pessoal. Os computadores tornaram-se tão econômicos que as pessoas podiam comprá-los para utilização pessoal ou profissional. Em 1981, a IBM, o maior fornecedor de computadores do mundo, lançou o IBM Personal Computer. Essa computação pessoal rapidamente legitimada em negócios, indústria e órgãos do governo, como mainframes IBM, era intensamente utilizada.
Esses computadores eram unidades ‘independentes’ — as pessoas transportavam discos de um lado para o outro para o compartilha- mento de informações (freqüentemente chamado de ‘rede peão’). Embora computadores pessoais antigos não fossem suficientemente poderosos para compartilhamento de tempo de vários usuários, essas máquinas podiam ser interconectadas em redes de computadores, às vezes por linhas telefônicas e às vezes em redes locais (local area networks – LANs) dentro de uma organização. Isso levou ao fenômeno da computação distribuída, em que a computação de uma organização, em vez de ser realizada somente em alguma central de processamento, é distribuída por redes para os sites em que o trabalho da organização é realizado. Os computadores pessoais eram poderosos o bastante para tratar os requisitos de computação de usuários individuais, bem como as tarefas básicas de comunicação de passar eletronicamente informações entre computadores.
Os computadores pessoais de hoje são tão poderosos quanto as máquinas de milhões de dólares de apenas algumas décadas atrás. As máquinas desktop mais poderosas — chamadas estações de trabalho — fornecem enormes capacidades a usuários individuais. As informações são facilmente compartilhadas através de redes de computadores em que computadores chamados servidores de arquivos oferecem um armazenamento de dados comum que pode ser utilizado por computadores clientes distribuídos por toda a rede, daí o termo computação cliente/servidor. O C++ tornou-se largamente utilizado para escrever software para sistemas operacionais, redes de computadores e aplicativos cliente/servidor distribuídos. Sistemas operacionais populares de hoje, como UNIX, Linux, Mac OS X e sistemas baseados no Windows da Microsoft, fornecem os tipos de capacidades discutidas nesta seção.
1.6 A Internet e a World Wide Web
A Internet — uma rede global de computadores — foi iniciada há quase quatro décadas com o financiamento fornecido pelo Depar- tamento de Defesa dos Estados Unidos. Originalmente projetada para conectar os principais sistemas de computador de cerca de uma dúzia de universidades e organizações de pesquisa, a Internet hoje é acessível por computadores em todo o mundo.
Deitel_C++_Cap01.indd 4
5
Com o surgimento da World Wide Web — que permite aos usuários de computador localizar e visualizar documentos baseados em multimídia sobre quase qualquer assunto pela Internet — a Internet explodiu, tornando-se um dos principais mecanismos de comu- nicação do mundo.A Internet e a World Wide Web estão certamente entre as criações mais importantes e profundas da raça humana. Antigamente, a maioria dos aplicativos de computador era executada em computadores que não se comunicavam entre si. Os aplicativos de hoje podem ser escritos para se comunicar entre os computadores do mundo. A Internet funde computação e tecnologias de comunicação. Ela torna nosso trabalho mais fácil. Ela torna informações acessíveis mundialmente de maneira instantânea e conveniente. Permite aos indivíduos e às empresas de pequeno porte local obter exposição mundial. E está mudando a maneira como os negócios são feitos. As pessoas podem procurar os melhores preços em praticamente todos os produtos ou serviços. Comunidades de interesse especial podem permanecer em contato entre si. Os pesquisadores podem tornar-se instantaneamente cientes dos últimos avanços científicos. Depois de dominar o Capítulo 19, “Programação Web”, você será capaz de desenvolver aplicativos de computador baseados na Internet.
1.7 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 diretamente compreensíveis por computadores, e outras requerendo passos intermediários de tradução. Centenas de linguagens de computador estão atualmente em uso. Essas linguagens podem ser divididas em três tipos gerais:
1. Linguagens de máquina 2. Linguagens assembly 3. Linguagens de alto nível
Qualquer computador pode entender diretamente somente sua própria linguagem de máquina. A linguagem de máquina é a ‘linguagem natural’ de um computador e como tal é definida pelo seu design de hardware. [Nota: A linguagem de máquina é, muitas vezes, referida como código-objeto. Este termo é anterior à ‘programação orientada a objetos’. Essas duas utilizações de ‘objeto’ estão relacionadas.] As linguagens de máquina consistem geralmente em strings de números (em última instância reduzidas a 1s e 0s) que instruem os computadores a realizar suas operações mais elementares uma de cada vez. As linguagens de máquina são dependentes de máquina (isto é, uma linguagem particular de máquina pode ser utilizada apenas em um tipo de computador). Essas linguagens são muito complexas para os seres humanos, como ilustrado pela próxima seção de um antigo programa de linguagem de máquina que soma o ganho em horas extras ao salário-base e armazena o resultado no salário bruto:
+1300042774 +1400593419 +1200274027
A programação de linguagem de máquina era simplesmente muito lenta, tediosa e propensa a erro para a maioria dos programadores. Em vez de utilizar as strings de números que os computadores poderiam entender diretamente, os programadores começaram a utilizar abreviações em inglês para representar operações elementares. Essas abreviações formaram a base das linguagens assembly. Programas tradutores chamados assemblers foram desenvolvidos para converter os primeiros programas de linguagem assembly em linguagem de máquina a velocidades de computador. A seção a seguir de um programa de linguagem assembly também soma os ganhos em horas extras ao salário-base e armazena o resultado no salário bruto:
load basepay add overpay store grosspay
Embora tal código seja mais claro para humanos, ele é incompreensível para computadores até ser traduzido em linguagem de má quina.
O uso de computadores aumentou rapidamente com o advento de linguagens assembly, mas os programadores ainda tinham de utilizar muitas instruções para realizar até as tarefas mais simples. Para acelerar o processo de programação foram desenvolvidas linguagens de alto nível, em que instruções únicas poderiam ser escritas para realizar tarefas substanciais. Os programas tradutores chamados compiladores convertem os programas de linguagem de alto nível em linguagem de máquina. Linguagens de alto nível permitem aos programadores escrever instruções que se parecem com o inglês cotidiano e contêm notações matemáticas comumente utilizadas. Um programa de folha de pagamentos escrito em uma linguagem de alto nível poderia conter uma instrução assim
grossPay = basePay + overTimePay;
Do ponto de vista do programador, obviamente, as linguagens de alto nível são preferíveis à linguagem de máquina e linguagem assembly. O C, o C++, as linguagens .NET da Microsoft (por exemplo, Visual Basic .NET, Visual C++ .NET e C#) e o Java estão entre as linguagens de programação de alto nível mais amplamente utilizadas.
O processo de compilação de um programa de linguagem de alto nível em linguagem de máquina pode consumir uma quantidade considerável de tempo de processamento. Programas interpretadores foram desenvolvidos para executar programas de linguagem de alto nível diretamente, embora muito mais lentamente. Os interpretadores são populares em ambientes de desenvolvimento de programa em que novos recursos são adicionados, e os erros, corrigidos. Depois que um programa está completamente desenvolvido, uma versão compilada pode ser produzida para executar mais eficientemente.
1.7 Linguagens de máquina, linguagens assembly e linguagens de alto nível
Deitel_C++_Cap01.indd 5
1.8 História do C e do C++
O C++ desenvolveu-se a partir do C, que se desenvolveu a partir de duas linguagens de programação 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 para sistemas operacionais. Ken Thompson modelou muitos recursos em sua linguagem B com base nas suas contrapartes em BCPL, e utilizou o B para criar versões anteriores do sistema operacional UNIX na Bell Laboratories em 1970.
A linguagem C foi desenvolvida da linguagem B por Dennis Ritchie na Bell Laboratories. O C utiliza muitos conceitos importantes de BCPL e B. No início, o C tornou-se amplamente conhecido como a linguagem de desenvolvimento do sistema operacional UNIX. Hoje, a maioria de sistemas operacionais é escrita em C e/ou C++. O C está agora disponível para a maioria dos computadores e é independente de hardware. Com design cuidadoso, é possível escrever programas em C que sejam portáveis para mais computadores.
A utilização disseminada de C com vários tipos de computadores (às vezes chamados plataformas de hardware) infelizmente levou a muitas variações. Isso era um problema sério para desenvolvedores de programa, que precisavam escrever programas portáveis que executassem em várias plataformas. Uma versão-padrão de C era necessária. O American National Standards Institute (ANSI) cooperou com a International Organization for Standardization (ISO) para padronizar o C em todo o mundo; o documento-padrão em conjunto foi publicado em 1990 e é referido como ANSI/ISO 9899: 1990.
Dica de portabilidade 1.1
Como o C é uma linguagem padronizada, amplamente disponível e independente de hardware, os aplicativos escritos em C podem