Vous êtes sur la page 1sur 66

ALGORITMOS E PROGRAMAO

Professora: GELLARS TAVARES

O QUE O C++
(Apostila retirada do site: http://www.linhadecodigo.com.br/artigos.asp?id_ac=331)

INTRODUO A linguagem de programao C++ , na verdade um superconjunto da linguagem de programao C (seu primeiro nome foi "C com Classes"). A razo da linguagem C ter sido chamada de C simplesmente porque ela foi sucessora de uma linguagem chamada B, desenvolvida por Ken Thompson em 1970 e que rodava em um DEC PDP-7, um computador muito menos potente do que um PC moderno. O sistema operacional UNIX original rodava naquela mquina, e foi ali tambm onde o B nasceu (o B em si foi o sucessor de uma linguagem chamada BCPL, escrita por Martin Richards). No entanto, o B era um tanto quanto restrito. Em 1972 Dennis Ritchie e Ken Thompson criaram a Linguagem C para aumentar o poder do B. O C no se tornou popular imediatamente aps sua criao. Na verdade, ele permaneceu como um assunto quase esotrico pelos seis anos seguintes. Em 1978, Brian Kernighan e Dennis Ritchie escreveram o famoso "The C Programming Language", o qual tenho um exemplar original em Ingls da 1. Edio, obrigado. Este livro simplesmente mudou tudo. Com a divulgao do C houve uma exploso de interesse, e a linguagem foi implementada em computadores de 8 bits que rodavam o sistema operacional CP/M. Mas foi o lanamento do IBM PC, em 1981, que realmente deu impulso ao C. Quando a revoluo do PC comeou, o C estava em uma posio privilegiada para aproveit-la. medida que o nmero de PC's explodia, tambm explodia o nmero de usurios do C. O C libertou-se de seu ambiente UNIX original e tornou-se uma linguagem "popular" para microcomputadores. Vale a pena salientar que ele se tornou popular por uma razo muito boa: os programadores gostaram de us-lo. Ao contrrio de outras linguagens, o C dava ao programador grande controle sobre o computador, tal controle, no entanto, traz tambm a responsabilidade: h muitas coisas que voc pode fazer em C que arruinaro seu programa ou travaro seu computador. Ou seja, voc pode fazer em C coisas que outras linguagens jamais permitiriam. Os programadores gostaram disso, imagine quem no gostaria poder fazer praticamente tudo com um computador! O C tornou-se uma ferramenta e no um obstculo. O C tornou-se a combinao perfeita entre o controle e poder de programao. medida que a popularidade do C crescia, crescia tambm o nmero de aplicativos escritos em C. Depois de certo tempo, os programas em C ficavam cada vez maiores e algumas pessoas comearam a achar que as construes de programao padro simplesmente no estavam altura da tarefa. Uma soluo seria tornar os programas mais modulares, atravs do uso de funes. No entanto algumas funes acabavam precisando compartilhar dados, outras precisavam coordenar seu trabalho com outras e, de novo, era possvel acabar precisando ter de guardar na cabea dzias de coisas ao mesmo tempo. A ento apareceu o Dr. Bjarne Stroustrup e desenvolveu o C++, inspirado em parte por outras linguagens, como o Simula67, Smalltalk, at hoje considerada uma das mais puras linguagens OO. O trecho de uma entrevista com o Dr. Bjarne Stroustrup:

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

"Inventei C++, escrevi suas definies preliminares e produzi sua primeira implementao. Escolhi e formulei os critrios de projeto para C++, projetei seus principais recursos e era responsvel pelo processamento de propostas de extenso no comit de padres C++". Acho que ningum melhor como referncia na linguagem que o Dr. Bjarne. Mais detalhes sobre ele, acesse http://www.research.att.com/~bs/homepage.html O nome C++ foi criado por Rick Mascitti em 1983, o nome representa um incremento (operador ++ de incremento no C) na linguagem C. A linguagem no foi chamada de D porque uma extenso da linguagem C. No incio no havia documentao de projeto do C++, nem comit para aprovao dos padres C++. Em 1987 (ano que comecei a me dedicar em programao de computadores) com a exploso do C++ foi-se necessrio que a padronizao formal do C++ acontecesse. Aps vrios anos e vrias propostas de padronizaes, em 1995 foi divulgado um projeto de padro inicial para reviso pblica e em 1998 um padro internacional formalmente aprovado para C++. Bem pessoal, acho que agora todos conhecem um pouco da histria do C++, vamos dar prosseguimento ao nosso estudo. Vamos agora abordar uma viso geral do C++, sem entrar em detalhes minuciosos de definio da linguagem. O objetivo fornecer uma viso geral de C++ e as principais tcnicas para us-la. Logo nos prximos artigos da srie "Iniciando em C++" vamos fornecer informaes detalhadas sobre o que est descrito abaixo neste artigo. O que estamos passando daqui pra frente uma viso geral do C++, ou seja, da linguagem de programao C++, e no de um pacote de desenvolvimento, seja ele, Visual C++, C++ Builder, C++.NET VS.NET, GCC (Unix). Estes prximos artigos descrevero o C++ ISO/ANSI. Depois aps voc estiver familiarizado com o C++, vamos tomar um outro rumo, que o pacote da Microsoft VS.NET C++ e MS Visual C++ 6.0. No prximo tpico, iniciaremos nossa srie propriamente dita, e imprescindvel que voc que deseja aprender C++, tenha alguns conhecimentos de Orientao a Objeto, abstrao de dados, etc. O que o C++ O C++ uma linguagem de uso geral, com uma tendncia para a programao de sistemas e que: uma linguagem C melhorada; Suporta abstrao de dados; Suporta programao orientada a objetos; Suporta programao genrica;

Como mencionei acima, no vamos tentar adivinhar qual o sistema operacional que voc est utilizando, vamos aprender o C++ ISO/ANSI padro, que a partir de agora ser chamado de C++. Nesta etapa no vamos fazer referncias a janelas, listbox, textbox, grficos, etc., ou seja, tudo o que depender de sistema operacional. Vamos utilizar nesta fase a 'sada padro', ou seja, a console. Compilador e Editor

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Como um grande f da Microsoft, no poderia deixar de utilizar as ferramentas MS, ento para a parte prtica, vamos utilizar o VS.NET para isso. Quem no tiver o VS.NET, poder tambm utilizar o Visual C++ 6.0 ou C++ Builder da Borland, ou quem sabe ainda, algum outro compilador Unix/Linux de sua preferncia. Todos os projetos que vamos desenvolver agora sero baseados em uma console DOS, ou seja, uma Win32 Console Application. Comeando um novo Projeto Acho que j est na hora de comear, vamos l. Como estamos usando o VS.NET 2003, vamos iniciar um novo projeto. Selecione o menu File->New->Project e em seguida ser apresentada a seguinte tela:

Voc dever selecionar sempre Visual C++ Projects->Win32 Console Project ATENO: Se estiver utilizando o VS.NET 2003, ateno para a seleo de aplicaes Win32 e no aplicaes .NET. Voc dever estar perguntando agora, porque aplicaes Win32 e no aplicaes .NET??? Simples, porque as aplicaes .NET utilizam as Managed Extensions, ou seja, extenses gerenciadas, que de uma certa forma encapsulam as funcionalidades do C++ padro. E o nosso objetivo agora o aprendizado do C++ padro. Logo mais adiante no nosso curso, estarei explicando outros tipos de aplicaes, mas por enquanto vamos utilizar Win32 Console Project ou para o Visual C++ 6.0 Win32 Console Application.

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Aps selecionar o tipo de projeto, voc dever selecionar Project Empty. Obs.: No VC++.NET voc dever selecionar Project Settings para alterar esta opo. Caso no venha a selecionar Project Empty o VC++ criar uma classe com uma aplicao Hello World j definida, que por enquanto no utilizaremos. Ciclo de Desenvolvimento Se todos os programas funcionassem logo na primeira vez que fosse testado, o ciclo de desenvolvimento completo seria o seguinte: escrever o programa, compilar o cdigo fonte, vincular o programa e execut-lo. Infelizmente, quase todos os programas, independentemente do grau de complexidade que apresente, podem e contero erros (Lei de Murphy), mais conhecidos como bugs. Alguns erros faro com que a compilao falhe, outros faro com que a vinculao ou linkedio no funcione e haver aqueles que s daro problema quando o programa for executado. Independentemente do tipo de erro com o qual voc se depare, corrija-o; sua correo envolve a edio do cdigo-fonte, uma nova compilao, uma nova vinculao e por fim uma nova execuo do programa. Atualmente com as novas verses do VC++ (.NET e VS 6.0) perfeitamente possvel editar o cdigo enquanto se depura a aplicao, e uma compilao incremental feita. No recomendo esta prtica, exceto casos particulares, pois algumas referncias de ponteiros podero ser perdidas e seu sistema ficar instvel. Nosso primeiro Programa em C++ No poderia deixar de ser, afinal todos os autores citam o exemplo seja em qualquer linguagem, o nosso tradicional "Alo Mundo" ou podemos utilizar "Hello World". No vamos fugir regra. Aps criar o projeto vazio, selecione o menu File->New e selecione C++ Source File. (para VC++ 6.0) e selecione File->Add New Item e selecione C++ Source File (VC++.NET) Agora digite o cdigo abaixo: #include <iostream> using namespace std; int main() { cout << "Ol Mundo!\n"; return 0; } Quando tiver digitado o texto acima, selecione a opo Salvar. Na C++ todos os caracteres, incluindo os sinais de pontuao, so de fundamental importncia e devem ser digitados com absoluta preciso. Alm disso, a C++ faz distino entre letras maisculas e minsculas; portanto, h diferena entre Return e return. Para compilar e executar o programa acima, tecle F5 ou CTRL-F5 (Visual Studio 6.0 ou .NET) para executar e esperar que o usurio tecle algo para continuar, permitindo ver a sada da console.

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Quanto s funcionalidades de cada ambiente de desenvolvimento, sugerimos voc de dar uma breve leitura no manual do ambiente utilizado para verificar como se compila um programa, como se depura um programa, etc. DICA: No Visual Studio, a tecla F5 executa o programa, compilando-o se necessrio e fazendo a linkedio do mesmo. Para Compilar um programa somente, selecione a opo Compile do menu Build. Erros de Compilao Os erros em tempo de compilao podem ocorrer por uma srie de razes. Geralmente, eles so decorrentes de uma pequena inverso de letras em uma palavra ou outro pequeno erro cometido acidentalmente. Os bons compiladores no apenas lhe diro o que aconteceu de errado, como tambm identificaro o local exato em que houve um erro de cdigo. Os melhores compiladores do mercado chegaro at a sugerir uma soluo para o problema! ATENO: Embora os compiladores modernos tentem localizar a linha em que est o erro, a ausncia de um ponto-e-vrgula ou de uma chave de fechamento pode confundir o compilador e voc pode achar que ele est apontando para uma linha que no apresenta problema. Tome muito cuidado com os erros de pontuao, cuja deteco pode ser mais difcil. Voc pode testar este programa colocando intencionalmente um erro em seu programa. Se o Exemplo01.cpp for executado sem problema, edite-o agora e remova a chave de fechamento existente no final do cdigo. Seu programa ter a seguinte aparncia: #include <iostream> using namespace std; int main() { cout << "Hello World!\n"; return 0; } Recompile o seu programa a fim de ver um erro semelhante: Exemplo01.cpp(11): fatal error C1075: end of file found before the left brace '{' at Exemplo01.cpp(7)' was matched Esta mensagem de erro do VC++.NET, no VC++ 6.0 diferente, mas tem o mesmo significado. Algumas vezes, os erros apenas o aproximavam do problema. Se o compilador pudesse identificar todos os erros com exatido, ele mesmo corrigiria o cdigo. Neste artigo, voc aprendeu a preparar o programa em C++, lembrando que este procedimento se aplica ao VC++ 6.0 e VC++.NET. Caso voc tenha alguma dvida sobre a utilizao de outros ambientes de desenvolvimento, verifique na documentao do C++ do ambiente para saber como faze-lo, caso necessrio entre em contato, que terei imenso prazer em ajud-lo.

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

INSTRUES
INTRODUO Neste artigo da srie Iniciando em C++ voc aprender o que so instrues e expresses e como se trabalha com operadores. INSTRUES Na verdade, um programa nada mais do que um conjunto de comandos executados em seqncia. Uma instruo controla a seqncia de execuo, avalia uma expresso ou no faz nada (a instruo null). Todas as instrues em C++ terminam com um ponto-e-vrgula. Uma instruo simples e comum uma atribuio: x = a + b; Ao contrrio da lgebra, essa instruo no significa que x igual a a+b. Na verdade, ela lida da seguinte maneira: "Atribua o valor da soma de a e b a x." ou "atribua a x, a + b". Muito embora essa instruo faa duas coisas, ela uma instruo e, portanto, tem um ponto-evrgula. O operador de atribuio atribui qualquer coisa que esteja direita de qualquer coisa que esteja esquerda. ESPAO EM BRANCO Os espaos, juntamente com as tabulaes e as novas linhas, so chamados de espaos em branco. Em geral, o espao em branco extra ignorado pelo compilador; qualquer lugar no qual voc veja um espao pode colocar uma tabulao ou uma nova linha sem maiores problemas. A nica finalidade de se incluir um espao em branco tornar o programa mais legvel para os humanos; o compilador no perceber a sua existncia. A instruo de atribuio poderia ter sido digitada como x=a+b; ou como x = a+ b; DICA: Use espaos em branco para tornar o cdigo mais legvel. Embora essa ltima variao seja aceita sem o menor problema, ela tambm uma grande tolice. O espao em branco deve ser usado para tornar os programas mais legveis e fceis de manter, mas tambm pode ser usado para criar um cdigo indecifrvel. Nesse caso, como em tudo o mais, a C++ fornece o poder; o julgamento voc quem faz.

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

INSTRUES COMPOSTAS Qualquer que seja o lugar no qual voc coloque uma instruo simples, coloca tambm uma instruo composta. Instruo composta uma instruo que comece com uma chave de abertura ({) e termine com uma chave de fechamento (}). Embora todas as instrues em uma instruo composta devam terminar com um ponto e vrgula, a instruo composta em si no termina com um ponto-e-vrgula. Por exemplo: { temp = a; a = b; b = temp;

Essa instruo composta alterna os valores nas variveis a e b. Expresses Qualquer coisa que retorne um valor uma expresso em C++. Operadores Um operador um smbolo que faz com que o compilador execute uma ao. Operador de atribuio O operador de atribuio (=) faz o operando esquerda do operador de atribuio ter seu valor alterado para o valor direita do operador de atribuio. A expresso x = a + b; atribui o valor que resulta da adio de a e b ao operando x. Um operando que pode estar legalmente esquerda de um operador de atribuio chamado de um valor e (esquerda). O que pode estar direita chamado (como pode imaginar) de valor d. As constantes so valores d; elas no podem ser valores e. Dessa maneira, voc pode digitar x = 35; // OK mas no pode digitar 35 = x; // erro, isso no um valor e! Valores E e valores D - Um valor E um operando que pode estar esquerda expresso. Um valor D um operando que pode estar direita de uma expresso. que todos os valores E so valores D, mas nem todos os valores D so valores E. Um de valor D que no um valor E uma literal. Desse modo, voc pode digitar x = 5;, pode digitar 5 = x; de uma Observe exemplo mas no

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Operadores matemticos Existem cinco operadores matemticos: adio (+), subtrao (-), multiplicao (*), diviso (/) e mdulo (%). Adio, subtrao e multiplicao agem como voc est acostumado. O mesmo no acontece com a diviso. A diviso de um inteiro apresenta algumas diferenas em relao diviso cotidiana. Quando voc divide 21 por 4, o resultado um nmero real (um nmero com frao). Os inteiros no aceitam fraes e, por essa razo, o 'resto' descartado. O valor retornado por 21 / 4 5. O operador de mdulo (%) retorna o valor do resto da diviso do inteiro. Portanto, 21 % 4 1, pois 21/4 5 com um resto de 1. Surpreendentemente, a descoberta do mdulo tem l sua utilidade. Por exemplo, pode ser que voc deseje imprimir uma instruo a cada dez aes. Sabe-se, no entanto, que qualquer nmero % 10 retornar 0 se o nmero for um mltiplo de 10. Assim, 20 % 10 zero. 30 % 10 zero.

Instrues
Combinando os operadores de atribuio e matemticos No raro querer adicionar um valor a uma varivel e, em seguida, atribuir o resultado varivel. Em C++, voc pode digitar minhaIdade += 2; Essa instruo aumenta o valor em minhaIdade por 2. Incremento e decremento O valor mais comum a ser adicionado (ou subtrado) e, em seguida, retribudo a uma varivel 1. Em C++, a adio de 1 a um valor chamada de incrementao e a subtrao de 1 chamada de decrementao. H operadores especiais para executar essas aes. O operador de incremento (++) acrescenta 1 ao valor da varivel e o operador de decremento (--) subtrai 1. Dessa forma, se voc tem uma varivel C, e deseja incrementa-la, tem que usar esta instruo: C++; // comea com C e a incrementa em 1 Prefixo e sufixo Tanto o operador de incremento (++) como o operador de decremento (--) tm duas verses: prefixo e sufixo. Prefixo - O operador digitado antes do nome da varivel (++minhaIdade). Sufixo - O operador digitado depois do nome da varivel (minhaIdade++). Em uma instruo simples, faz pouca diferena usar um ou outro, mas, em uma instruo complexa, quando voc incrementa (ou decrementa) uma varivel e em seguida atribui o

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

resultado a outra varivel, tal ordem de grande importncia. O operador de prefixo avaliado antes da atribuio e o sufixo avaliado depois. A semntica do prefixo esta: incrementa o valor e, em seguida, o recupera. A semntica do sufixo diferente: recupera o valor e, em seguida incrementa o original. Isso em princpio pode parecer confuso, mas se X for um inteiro cujo valor 5 e voc digitar int a = ++x; estar instruindo o compilador a incrementar X (tornando-o 6) e, em seguida, recuperar o valor e atribu-lo a A. Sendo assim, A agora 6 e X agora 6.

Se, depois disso, voc digitar: int b = x++; estar instruindo o compilador a recuperar o valor de X (6) e atribu-lo a B, e em seguida, retornar e incrementar X. Assim, B agora 6, mas X agora 7. O cdigo abaixo demonstra o uso e as implicaes de ambos os tipos.

Nas linhas 8 e 9, duas variveis de inteiro so declaradas e cada uma delas inicializada com o valor 39. O valor delas impresso nas linhas 11 e 12. Na linha 14, minhaIdade incrementada usando o operador de incremento de sufixo, e na linha 15, suaIdade incrementada usando o operador de incremento de prefixo. Os resultados so impressos nas linhas 18 e 19 e so idnticos (ambos so 40).

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Na linha 21, minhaIdade incrementada como parte da instruo de impresso, usando o operador de incremento de sufixo. Como o sufixo, o incremento acontece depois da impresso e, portanto, o valor 40 impresso novamente. Por outro lado, na linha 22, suaIdade incrementada por meio do uso do operador de incremento de prefixo. Portanto, ele incrementado antes de ser impresso e o valor exibido como 41. Finalmente, nas linhs 24 e 25, os valores so impressos novamente. Como a instruo de incremento foi concluda, o valor em minhaIdade agora 41, pois esse o valor em suaIdade. E este valor no a minha idade real. J Precedncia Na instruo complexa, x = 5 + 3 * 8; o que executado primeiro, a adio ou a multiplicao? Se a adio for executada primeiro, a resposta ser 8 * 8, ou seja, 64. Se a multiplicao for executada primeiro, a resposta ser 5 + 24, ou seja, 29. A multiplicao tem uma precedncia maior do que a adio e, portanto, o valor da expresso acima 29. Quando dois operadores matemticos tm a mesma precedncia, eles so executados da esquerda para a direita. Dessa forma, em: x = 5 + 3 + 8 * 9 + 6 * 4; a multiplicao a primeira operao a ser avaliada, da esquerda para a direita. Assim, 8*9 = 72, e 6*4 = 24. Agora a expresso esta: x = 5 + 3 + 72 + 24; Agora a adio, da esquerda para a direita, 5 + 3 = 8; 8 + 72 = 80; 80 + 24 = 104. Tome cuidado com isso. Alguns operadores, como o de atribuio, so avaliados da direita para a esquerda! Em qualquer caso, e se a ordem de procedncia no atender a suas necessidades? Considere a expresso TotalSegundos = NumMinutosEsperar + NumMinutosTipo * 60; Nessa expresso, voc no deseja multiplicar a varivel NumMinutosdoTipo por 60 e, em seguida adiciona-la a NumMinutosEsperar. Voc deseja incluir as duas variveis de modo a obter o nmero total de minutos e, em seguida, multiplicar esse nmero por 60 para obter o total de segundos. Nesse caso, voc usa parnteses para alterar a ordem de precedncia. Os itens entre parnteses so avaliados como tendo uma precedncia maior do que qualquer outro operador matemtico. Dessa forma, TotalSegundos = (NumMinutosEsperar + NumMinutosTipo) * 60; apresentar o resultado desejado.

10

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Aninhando parnteses Em operaes complexas, voc precisar aninhar parnteses um dentro do outro. Por exemplo, pode necessitar computar o total de segundos e, em seguida, computar o nmero total de pessoas que esto envolvidas antes de multiplicar os segundos pelas pessoas: TotalPessoasSegundos = (((NumMinutosEsperar (PessoasNoTrabalho + PessoasDeFerias)); + NumMinutosdoTipo) * 60) *

Essa complicada expresso lida de dentro para fora. Primeiro, NumMinutosEsperar adicionado a NumMinutosdoTipo, pois esses so os parnteses mais internos. Em seguida, essa soma multiplicada por 60; PessoasNoTrabalho adicionado a PessoasDeFerias. Finalmente, o nmero total de pessoas encontrado multiplicado pelo nmero total de segundos. Esse exemplo suscita uma questo importante. Essa expresso fcil de o computador entender, mas muito difcil de uma pessoa ler, entender ou modificar. Veja a seguir a mesma expresso digitada de uma outra maneira, usando algumas variveis de inteiro temporrias: TotalMinutos = NumMinutosEsperar + NumMinutosDoTipo; TotalSegundos = TotalMinutos * 60; TotalPessoas = PessoasNoTrabalho + PessoasDeFerias; TotalPessoasSegundos = TotalPessoa * TotalSegundos; Esse exemplo demanda mais tempo para ser digitado e usa mais variveis temporrias do que o exemplo anterior, mas bem mais fcil de entender. Preceda-o com um comentrio para explicar o que o cdigo faz e mude o 60 para uma constante simblica. Assim ter um cdigo que fcil de entender e manter. A natureza da verdade Nas verses anteriores de C++, todas as verdades e falsidades eram representadas por inteiros, mas o novo padro ISO/ANSI introduziu um novo tipo: bool. Esse novo tipo tem dois valores possveis, false ou true. Todas as expresses podem ser avaliadas conforme sua verdade ou falsidade. As expresses que matematicamente so avaliadas como zero retornaro false e todas as outras retornaro true. Operadores relacionais Os operadores relacionais so usados para determinar se dois nmeros so iguais ou se um maior ou menor que o outro. Todas as expresses relacionais retornam true ou false. Existem seis operadores relacionais: igualdade (==), menor que (<), maior que (>), maior ou igual a (>=), menor ou igual a (<=) e diferente (!=). Nesta lio voc aprendeu o que so instrues, expresses e como se trabalha com operadores. O cdigo acima pode ser baixado clicando aqui.

11

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Variveis
Introduo Neste artigo da srie Iniciando em C++ voc aprender a declarar e definir variveis e constantes, a atribuir e manipular valores s variveis, e a remeter o valor de uma varivel para a tela. O que uma varivel? Os programas precisam de uma maneira para armazenar os dados que usam. As variveis e constantes oferecem uma variedade de formas para se trabalhar com nmeros e outros valores. Do ponto de vista de um programador, uma varivel um local na memria do computador no qual voc pode armazenar um valor e a partir do qual voc posteriormente pode recuper-lo. Para entender esse conceito, voc necessita de uma noo bsica da maneira como a memria do computador funciona. A memria do computador pode ser entendida como uma srie de cubculos, todos eles alocados lado a lado em uma longa fileira. Cada cubculo - ou localizao da memria - numerado sequencialmente. Esses nmeros so chamados de endereos de memria. As variveis tm, alm de endereos, nomes. Por exemplo, voc pode criar uma varivel chamada minhaIdade. Sua varivel um rtulo aplicado a um desses cubculos, cuja finalidade permitir que sejam localizados facilmente, sem saber o seu real endereo de memria. Reservando memria Quando voc define uma varivel em C++, deve informar ao compilador no apenas o seu nome, mas tambm o tipo de informao que ela contm: inteiro, caractere, entre outros. Ns chamamos isso de tipo da varivel. O tipo da varivel informa ao compilador o espao que a memria dispe para armazenar o valor da varivel. Cada cubculo tem 1 byte. Se o tipo de varivel que voc quer criar tiver 2 bytes, ela precisar de 2 bytes de memria, ou dois cubculos. O tipo da varivel (por exemplo, INT) informa ao compilador o espao em memria (quantos cubculos) reservado para a varivel. Como os computadores usam bits e bytes para representar valores, e como a memria medida em bytes, importante que voc entenda e se sinta familiarizado com esses conceitos. Tamanho dos inteiros Uma varivel char (usada para armazenar caracteres) costuma ter 1 byte. Um short int tem 2 bytes na maioria dos computadores, um long int geralmente tem 4 bytes e um int (sem a palavra short ou long) pode ser de 2 ou 4 bytes. Se voc estiver executando o Windows 95, Windows 98, NT, 2000 ou XP, pode levar em considerao que sua int tem 4 bytes desde que esteja usando um compilador moderno. Abaixo, o cdigo o ajudar a determinar o tamanho exato desses tipos no seu computador usando seu prprio compilador.

12

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

#include <iostream> int main() { cout << "O tamanho cout << "O tamanho cout << "O tamanho cout << "O tamanho cout << "O tamanho cout << "O tamanho cout << "O tamanho return 0; } signed e unsigned

de de de de de de de

um um um um um um um

int e:\t\t" << sizeof(int) << "bytes.\n"; um short int e:\t" << sizeof(short) <<"bytes.\n"; long int e:\t" << sizeof(long) <<"bytes.\n"; char e:\t\t" << sizeof(char) <<"bytes.\n"; bool e:\t\t" << sizeof(bool) <<"bytes.\n"; float e:\t\t" << sizeof(float) <<"bytes.\n"; double e:\t" << sizeof(double) <<"bytes.\n";

Alm disso, a maioria desses tipos vem em duas variedades: signed e unsigned. A idia aqui que algumas vezes voc precisa de nmeros negativos e algumas vezes no. Os inteiros (short e long) sem a palavra unsigned so tidos como signed. Os inteiros signed so negativos ou positivos. Os inteiros unsigned so sempre positivos. DICA: Use int em variveis numricas. Na maioria dos programas, na maioria das vezes, basta que voc afirme que as variveis numricas so int - que so inteiros signed. Tipos de varivies fundamentais Diversos outros tipos de variveis so construdos na C++. Eles podem ser divididos em variveis de inteiro (o tipo discutido at agora), variveis de ponto flutuante e variveis de caractere. Varivies de ponto flutuante e de caractere - As variveis de ponto flutuante tm valores que podem ser expressos como fraes, ou seja, que so nmeros reais. As variveis de caractere armazenam um byte e so usadas para armazenar 256 caracteres e smbolos dos conjuntos de caracteres ASCII e ASCII estendidos. O conjunto de caracteres ASCII - O conjunto de caracteres padro usado em computadores. ASCII o acrnimo de American Standard Code for Information Interchange. Quase todos os sistemas operacionais suportam ASCII, embora muitos tambm sejam compatveis com outros conjuntos de caracteres como, por exemplo, o EBCDIC. Os tipos de variveis usadas em programas C++, so descritos na Tabela abaixo, Essa tabela mostra o tipo de varivel, o espao que ele ocupa na memria e os tipos de valores que podem ser armazenados nessas variveis. Os valores que podem ser armazenados so determinados pelo tamanho dos tipos de variveis, e consequentemente pelo tipo de computador que est sendo utilizada a aplicao. Lembrando que estes so alguns dos tipos padres do C++ ANSI.
Tipo Tamanho Valores 0 a 65.535 - 32.768 a 32.767 0 a 4.294.967.295 -2.147.483.648 a 2.147.483.647

unsigned short int 2 bytes short int 2 bytes

unsigned short int 4 bytes long int 4 bytes

13

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

char bool float double

1 byte 1 byte 4 bytes 8 bytes

256 valores de caractere Verdadeiro ou falso 1,2e-38 a 3,4e38 2,2e-308 a 1,8e308

DICA: Use apenas int . Se voc estiver criando um int , no se preocupe com short versus long; use apenas int. Com um compilador moderno, isso criar um long int que ser satisfatrio em 99% das situaes. Definindo uma varivel Voc cria, ou define, uma varivel instruindo o seu tipo, seguido por um ou mais espaos, pelo nome da varivel e um ponto-e-vrgula. O nome da varivel pode ser virtualmente qualquer combinao de letras, mas no pode conter espaos. Bons nomes de variveis mostram a voc a finalidade delas; o uso de bons nomes facilita a compreenso do fluxo do seu programa. Distino entre maisculas e minsculas A C++ faz distino entre letras maisculas e minsculas. Em outras palavras, letras minsculas e maisculas so consideradas diferentes. Uma varivel cujo nome idade diferente de Idade que diferente de IDADE. Palavras chave Algumas palavras so reservadas pela C++ e voc no pode us-las como nomes de varivel. Essas so as palavras-chave usadas pelo compilador para controlar o seu programa. As palavras chaves incluem if, while, for e main. O manual do seu compilador deve fornecer uma lista completa, mas geralmente qualquer nome razovel para uma varivel quase certamente no uma palavra-chave. Criando mais de uma varivel de cada vez Voc pode criar mais de uma varivel ao mesmo tempo em uma instruo digitando o tipo e, em seguida, os nomes de varivel, separados por vrgulas. Por exemplo: unsigned int minhaIdade, meuPeso; // duas variveis unsigned int long area, largura, tamanho; // trs longs Atribuindo valores a suas variveis Voc atribui um valor a uma varivel usando o operador de atribuio (=). Portanto, voc atribuiria 5 como largura se digitasse: unsigned short largura; largura = 5;

14

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Ou voc poderia combinar essas etapas e inicializar largura quando defini-la por meio da seguinte instruo: unsigned short largura = 5 Constantes Como as variveis, as constantes so locais de armazenamento de dados. Mas as variveis mudam; as constantes, por outro lado, como voc deve ter imaginado, no mudam. Voc deve inicializar uma constante quando ela criada e no pode atribuir-lhe um novo valor posteriormente; depois que uma constante inicializada, seu valor , em uma palavra, constante. Constantes literais A C++ tem dois tipos de constantes: literais e simblicas. Uma constante literal um valor digitado diretamente em seu programa sempre que ele se fizer necessrio. Por exemplo:
int minhaIdade = 39;

minhaIdade uma varivel do tipo int; 39 uma constante literal. Voc no pode atribuir um valor a 39 e seu valor no pode ser alterado; Constantes simblicas Uma constante simblica uma constante que representada por um nome, assim como uma varivel tambm . Ao contrrio de uma varivel, no entanto, depois que uma constante inicializada, seu valor no pode ser alterado. Se o seu programa tem uma varivel inteira cujo nome estudantes e outra cujo nome classes, voc pode computar o nmero de estudantes que possui com base em um nmero conhecido de classes; se voc soubesse que h 15 estudantes por classe: estudantes = classes * 15; Nesse exemplo, 15 somente uma constante literal. Seu cdigo seria mais fcil de ler, e mais fcil de manter, se voc substutusse uma constante simblica por este valor: estudantes = classes * estudantesPorClasses; Se voc decidisse mudar o nmero de estudantes em cada classe, poderia faz-lo onde a constante estudantesPorClasses definida sem ter que fazer uma mudana em todos os locais em que usou este valor; Definindo constantes com #define Para definir uma constante forma antiga, odivel e politicamente incorreta, voc digitaria a seguinte instruo: #define estudantesPorClasses 15

15

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Observe que, como estudantesPorClasses no pertence a um tipo especfico (int ou char por exemplo), #define faz uma simples substituio de texto. Todas as vezes que o processador localizar a palavra estudantesPorClasses, ele colocar 15 no texto. Como o pr-processador executado antes do compilador, seu compilador jamais v a constante, ele v o nmero 15; Definindo constantes com const Embora #define funcione a contento, existe uma maneira nova, melhor, menos gordurosa e mais saborosa, para definir constantes no C++. const unsigned short int estudantesPorClasses = 15; Esse exemplo tambm declara uma constante simblica cujo nome estudantesPorClasses, mas desta vez estudantesPorClasses digitado com um unsigned short int. Dessa forma, voc digita mais texto, mas tem suas vantagens. A maior diferena que essa constante tem um tipo, e o compilador pode garantir que ele seja usado de modo compatvel com ele. Constantes enumeradas As constantes enumeradas criam um conjunto de constantes com uma faixa de valores. Por exemplo, voc pode declarar COR como uma enumerao e pode definir que h cinco valores para COR: Vermelho, Azul, Verde, Branco e Preto. A sintaxe de constantes enumeradas escrever a palavra-chave enum seguida pelo nome do tipo, uma chave de abertura, cada um dos valores aceitos separados por uma vrgula e finalmente uma chave de fechamento e um ponto-e-vrgula. Veja um exemplo: enum COR {Vermelho, Azul, Verde, Branco, Preto}; Essa instruo executa duas tarefas: 1. 2. Torna COR o nome de uma enumerao, ou seja, um novo tipo. Torna Vermelho uma constante simblica com o valor 0, Azul com valor 1, e assim por diante.

Todas as constantes enumeradas tm um valor inteiro. Se voc no especificar de outra maneira, a primeira constante ter o valor de 0 e os demais itens sero contados na ordem crescente a partir da. No entanto, qualquer uma das constantes por ser inicializada com um determinado valor, e as que ainda no tiverem sido inicializadas sero incrementadas com base no valor que o anteceder. Desse modo, se voc digitar: enum COR {Vermelho=100, Azul, Verde=500, Branco, Preto=700}; ento Vermelho ter o valor 100; Azul, o valor 101; Verde, o valor 500; Branco, o valor 501; e Preto, o valor 700. Neste artigo voc aprendeu a declarar e a definir variveis e constantes e a atribuir-lhes valores. Nos prximos artigos estaremos utilizando os conhecimentos adquiridos na construo de outros mdulos interessantes.

16

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

O que um programa em C++


Introduo As partes de um programa simples Antes de nos aprofundarmos nos detalhes da C++, como classes e variveis, vamos reservar um tempinho para termos uma noo do processo de montagem de um programa. O programa simples apresentado no primeiro artigo, Hello.cpp, tem muitas partes interessantes. Agora vamos ver o programa em detalhes. A listagem abaixo reproduz a verso original do Hello.cpp. 1: 2: 3: 4: 5: 6: 7: 8: 9: #include <iostream> using namespace std; int main() { cout << "Hello World!\n"; return 0; }

Output: Hello World! Na linha 1, o arquivo iostream includo no arquivo. Para o compilador como se voc tivesse digitado todo o contedo do arquivo iostream na abertura do Hello.cpp. Examinando o #include caractere por caractere O primeiro caractere o smbolo "#", que um sinal para o pr-processador. O prprocessador tem como funo ler o cdigo-fonte procura de linhas que comecem com o smbolo # e, quando o localiza, modifica o cdigo de acordo com a instruo do prprocessador. Include uma instruo do pr-processador que diz o seguinte: "O que vem a seguir um nome de arquivo. Localize o arquivo e leia-o agora mesmo". Os sinais <> em torno do nome do arquivo dizem a seguinte informao para o pr-processador: "Procure este arquivo nos lugares de sempre". Se o seu compilador estiver devidamente configurado, os <> faro com que o pr-processador procure o arquivo iostream no diretrio que armazena todos os arquivos de cabealho do seu compilador. O arquivo iostream (Input-Output-STREAM) usado pelo cout, que remete o texto para a tela. Na prtica, a linha 1 incluir o arquivo iostream no programa, como se voc mesmo o tivesse digitado. DICA 1: Porque no cdigo tem <iostream> e no <iostream>? Bem no C++ atual, o arquivo de cabealho no contm a extenso .H. Eram utilizados na verso do C++ antigo. DICA 2: Porque utilizar "<>" e ""? Bem caso voc utilize "" o compilador buscar somente no path onde est o seu cdigo.

17

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Anlise linha a linha A linha 3 indica que estamos utilizando o namespace STD. Um namespace permite dividir um programa em regies que mantm suas prprias tabelas de smbolos, estas regies so chamadas de regies declarativas. A idia por trs dos namespaces evitar que nomes declarados em um programa entrem em conflito com outros nomes definidos no mesmo programa, uma vez que os nomes de um namespace so independentes daqueles de outros. O que estamos realmente fazendo na linha 3 importar os espao de nomes global. Quando importamos um smbolo fica disponvel a todo o cdigo do programa. Se no namespace, para referenci-lo precisaremos qualifica-lo maneira: namespace::nome. Por exemplo: std::cout. smbolos do namespace STD para o para o espao de nomes global ele importarmos um smbolo e outro com seu namespace da seguinte

A linha 5 inicia o programa propriamente dito com uma funo cujo nome main(). Todos os programas em C++ tm uma funo main(). Em geral, uma funo um bloco de cdigo que executa uma ou mais aes. As funes so invocadas (alguns programadores preferem dizer que so chamadas) por outras funes, mas main() especial. Quando o seu programa iniciado, main() chamada automaticamente. main(), como todas as outras funes deve afirmar o tipo de valor que retornar. Mais uma vez, main() especial, pois retornar sempre int . Todas as funes comeam com uma chave de abertura ({) e terminam com uma chave de fechamento (}). As chaves da funo main() encontram-se nas linhas 6 e 9. Tudo o que estiver entre as chaves de abertura e de fechamento ser considerado como parte integrante da funo. cout utilizado para imprimir uma mensagem na tela. Os dois caracteres finais, "\n", fazem com que cout coloque uma nova linha depois das palavras "Hello World!". Na linha 8 chamamos o return 0. Ela retorna o controle para o sistema operacional. A funo main() termina na linha 9, com a chave de fechamento. Comentrios Um comentrio um texto adicionado para explicar (para voc ou outros programadores) o que est acontecendo com seu cdigo. O comentrio no tem efeito; serve apenas como documentao. H dois tipos de comentrios em C++. O comentrio de barra dupla (//), que chamaremos de comentrio no estilo C++, manda o compilador ignorar tudo que vem depois das barras at o final da linha. O comentrio de barra-asterisco (/*), no estilo C, manda o compilador ignorar tudo o que vem depois at que uma marca de comentrio de asterisco-barra (*/) seja detectada.

18

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Funes Embora main() seja uma funo incomum, pois chamada automaticamente quando seu programa inicializado. Todas as outras funes so chamadas pelo seu prprio cdigo medida que o programa executado. Um programa executado linha a linha na ordem em que aparece no cdigo-fonte, at uma funo ser chamada. Em seguida, o programa desvia para executar a funo. Quando termina a funo, ele retorna o controle para a linha posterior funo chamadora. Quando um programa precisa executar um servio, ele chama uma funo para executa-lo e, quando a funo retorna, o programa volta para o ponto imediatamente anterior funo chamada. As funes retornam um valor ou retornam um void, o que significa que no retornam nada. Observe que main() sempre retorna um int. Uma funo que inclui dois inteiros deve retornar a soma e, dessa forma, seria definida para retornar um valor inteiro. Uma funo que se restringe a imprimir uma mensagem no tem nada a retornar e, portanto, seria declarada para retornar nula. As funes consistem em um cabealho e um corpo. O cabealho consiste, por sua vez, no tipo de retorno, no nome da funo e nos parmetros dessa funo. O cabealho tambm definido como prottipo da funo. Os parmetros de uma funo permitem que os valores sejam passados para a funo. Assim, se a funo fosse adicionar dois nmeros, os nmeros seriam os parmetros da funo. Veja um exemplo abaixo: int Sum(int a, int b) Um parmetro uma declarao do tipo de valor que ser passado; o verdadeiro valor passado pelo funo chamadora chamada de argumento. Muitos programadores usam esses dois termos, parmetros e argumentos, com sinnimos. O nome da funo e seus parmetros (que o cabealho sem valor de retorno) chamado de assinatura da funo. O corpo de uma funo consiste em uma chave de abertura, nenhuma ou alguma(s) instruo(es) e uma chave de fechamento. As instrues constituem o trabalho da funo. Uma funo pode retornar um valor usando uma instruo return. Essa instruo far com que a funo seja fechada. Se voc no colocar uma instruo return na sua funo, ela automaticamente retornar um void no final da funo. O valor retornado deve ser do tipo declarado no cabealho da funo. Abaixo segue um exemplo que demonstra uma funo que utiliza dois parmetros inteiros e retorna um valor inteiro. Por enquanto no vamos nos preocupar com a sintaxe ou o modo como os valores inteiros funcionam. //Listagem 2.2 Func.cpp demonstra uma funo simples. #include <iostream> using namespace std; int Add (int x, int y) { cout << "Em Add(), recebeu " << x << " e " << y << "\n"; return (x+y); }

19

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

int main() { cout << "Estou em main()!\n"; int a, b, c; cout << "Digite dois nmeros: "; cin >> a; cin >> b; cout << "\nChamando Add()\n"; c=Add(a,b); cout << "\nDe volta para main().\n"; cout << "c foi definido como "<< c; cout << "\nSaindo...\n\n"; return 0; } A funo Add() definida na linha 3. O programa em si comea na linha 12, na qual ele imprime uma mensagem. O programa solicita dois nmeros para o usurio (linhas 14 e 15). O usurio digita cada nmero, separado por um espao, e em seguida pressiona <Enter>. Main() passa os dois nmeros digitados pelo usurio como argumentos para a funo Add() na linha 18. O processamento desvia para a funo Add(), que comea na linha 3. Os parmetros a e b so impressos e, em seguida, adicionados. O resultado retornado na linha 7 e a funo retorna. Nas linhas 15 e 16, o objeto cin usado para obter um nmero para as variveis A e B, e cout usado para remeter os valores para a tela. As variveis e outros aspectos desse programa sero depurados nos prximos artigos.

20

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Estrutura de um programa em C++


Provavelmente a melhor maneira de comear a aprender uma linguagem de programao com um programa. Ento aqui est nosso primeiro programa: // meu primeiro programa em C++ #include <iostream> int main () { cout << "Ola Mundo!\n"; return 0; } O lado esquerdo mostra o cdigo-fonte de nosso primeiro programa, no qual podemos nomelo, por exemplo, como hiworld.cpp. O lado direito mostra o resultado do programa depois de compilado e executado. A maneira de editar e compilar um programa depende do compilador que voc estiver usando. Dependendo se tem ou no uma interface de desenvolvimento e da verso. Consulte o manual ou a ajuda inclusa no seu compilador se tiver dvidas em como compilar um programa de console em C++. O programa anterior o primeiro programa que a maioria dos aprendizes codificam, e o resultado a impresso da frase "Ola Mundo!" na tela. um dos programas mais simples que pode ser codificado em C++, mas j inclui os componentes bsicos que todos os programas em C++ possuem. Ns iremos analis-los um por um: // meu primeiro programa em C++ Ola Mundo!

Essa uma linha de comentrio. Todas as linhas que iniciarem com duas barras (//) so consideradas comentrios e no tem nenhum efeito no comportamento do programa. Elas podem ser usadas pelo programador para incluir explicaes ou observaes curtas dentro do prprio cdigo. Nesse caso, essa linha uma breve descrio do que o nosso programa faz.
#include <iostream>

Comandos que comeam um sinal de numerao (#) so diretivas do pr-processador. Elas no so linhas de cdigo executveis, mas indicaes para o compilador. Nesse caso, o comando #include <iostream> diz ao pr-processador do compilador para incluir o arquivo de cabealho padro iostream. Esse arquivo especfico inclui as declaraes da biblioteca bsica de entrada-sada do C++, e est sendo usado porque suas funcionalidades sero usadas mais tarde nesse programa.
int main()

Essa linha corresponde ao incio da declarao da funo main. A funo main o ponto pelo qual todos os programas em C++ iniciam a execuo. No faz diferena se estiver no incio, no fim, ou no meio do cdigo seu contedo sempre o primeiro a ser executado 21

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

quando um programa inicia. Alm disso, pelo mesmo motivo, obrigatrio que todos os programas em C++ tenham uma funo main.
Depois de main h um par de parnteses () porque uma funo. Em C++ todas as funes so seguidas por um par de parnteses () que, opcionalmente, podem incluir argumento dentro deles. O contedo da funo main segue imediatamente aps sua declarao formal e coberto entre chaves ({}), como em nosso exemplo. cout << "Ola Mundo!";

Essa instruo faz a coisa mais importante nesse programa. cout o dispositivo de sada padro no C++ (geralmente o monitor), e a frase completa insere uma sequncia de caracteres ("Ola Mundo!" nesse caso) no dispositivo de sada (o monitor). cout declarado no arquivo de cabealho iostream, ento pra que seja possvel utiliza-lo, esse arquivo precisa ser incluso.
Note que a frase termina com um caractere ponto-e-vrgula (;). Esse caractere significa o fim da instruo e precisa ser includo aps toda instruo em qualquer programa em C++ (um dos erros mais comuns dos programadores de C++ devido ao fato de esquecerem de incluir um ponto-e-vrgula ; no final de cada instruo). return 0;

A instruo return faz com que a funo main() termine e retorne o cdigo que segue a instruo, nesse caso o 0. Essa a maneira mais comum de terminar um programa que no encontrou nenhum erro durante sua execuo. Como voc ver em exemplos seguintes, todos os programas em C++ terminam com um comando parecido com esse.
Sendo assim, voc deve ter notado que nem todas as linhas desse programa realizaram uma ao. Havia linhas contendo apenas comentrios (aquelas iniciadas por //), linhas com instrues para o pr-processador do compilador (aquelas iniciadas por #), tambm haviam linhas que iniciavam a declarao de uma funo (nesse caso, a funo main) e, finalmente linhas com instrues (como a chamada cout <<), todas essas ltimas foram includas dentro do bloco delimitado pelas chaves ({}) da funo main. O programa foi estruturado em linhas diferentes para que seja mais fcil l-lo, mas isso no obrigatrio. Por exemplo, ao invs de:

int main () { cout << " Ola Mundo! "; return 0; }

poderamos ter escrito:


int main () { cout << " Ola Mundo! "; return 0; }

em apenas uma linha e isso teria exatamente o mesmo significado.

22

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Em C++, a separao entre instrues especificada com um ponto-e-vrgula (;) no final de cada instruo. A diviso do cdigo em linhas diferentes serve somente para torn-lo mais legvel e esquemtico para seres humanos. Aqui est um programa com mais instrues: // meu segundo programa em C++ #include <iostream> int main () { cout << "Ola Mundo! "; cout << "Eu sou um programa em C++"; return 0; } Nesse caso ns usamos o mtodo cout << duas vezes em duas instrues diferentes. Mais uma vez, a separao do cdigo em linhas diferentes s foi feita para dar maior legibilidade ao programa, j que main poderia ter sido definida perfeitamente assim: int main () { cout << " Ola Mundo! "; cout << " Eu sou um programa em C++ "; return 0; } Ola Mundo! Eu sou um programa em C++

Ns tambm poderamos dividir o cdigo em mais linhas se considerssemos conveniente:


int main () { cout << "Ola Mundo!"; cout << "Eu sou um programa em C++"; return 0; }

E o resultado teria sido exatamente o mesmo dos exemplos anteriores.


As diretivas de pr-processador (aquelas que comeam por #) esto fora dessa regra j que elas no so instrues verdadeiras. Elas so linhas lidas e descartadas pelo pr-processador e no produzem nenhum cdigo. Essas precisam ser especificadas em suas prprias linhas e no requerem a incluso de um ponto-e-vrgula (;) no final.

Comentrios.
Comentrios so pedaos de cdigo-fonte descartados do cdigo pelo compilador. Eles no fazem nada. O objetivo deles somente permitir que o programador insira notas ou descries dentro do cdigo-fonte.

23

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

O C++ suporta duas maneiras para inserir comentrios: // comentrio de linha /* comentrio de bloco */

O primeiro deles, o comentrio de linha, descarta tudo desde onde o par de barras (//) achado at o final daquela mesma linha. O segundo deles, o comentrio de bloco, descarta tudo entre os caracteres /* e a prxima apario dos caracteres */, com a possibilidade de incluir diversas linhas.
Ns iremos adicionar comentrios ao nosso segundo programa: Ola Mundo! Sou programa em C++ /* meu segundo programa em C++ com mais comentrios */ #include <iostream> int main () { cout << "Ola Mundo! "; //diz Ola Mundo! cout << "Sou programa em C++"; //diz Sou programa em C++ return 0; }

Se voc incluir comentrios dentro do cdigo-fonte de seus programas sem usar as combinaes de caracteres //, ou /* e */, o compilador ira entend-los como se fossem instrues C++ e, na maioria das vezes, ir causar um ou mais mensagens de erro.

24

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Operadores.
Agora que voc j conhece a existncia de variveis e constantes, podemos comear a utilizlas. Para isso, C++ prov os operadores, no qual nessa linguagem um conjunto de palavraschave e smbolos que no fazem parte do alfabeto, mas esto disponveis em todos os teclados. importante conhec-los j que eles formam a base da linguagem C++. Voc no precisa memorizar todo o contedo dessa pgina, pois os detalhes so dados somente para servirem como uma futura referncia caso voc precise.

Atribuio (=). O operador de atribuio serve para atribuir um valor a uma varivel.
a = 5;

atribui o valor inteiro 5 para a varivel a. A parte da esquerda do operador = conhecida como lvalue (left value valor da esquerda) e a da direita como rvalue (right value valor da direita). lvalue precisa sempre ser uma varivel, enquanto o lado direito pode ser uma constante, uma varivel, o resultado de uma operao ou qualquer combinao entre eles.
preciso enfatizar que a operao de atribuio sempre funciona da direita para a esquerda e nunca o oposto. a = b;

atribui para a varivel a (lvalue) o valor contido na varivel b (rvalue) independentemente do valor que estiver guardado em a nesse momento. Considere tambm que estamos apenas atribuindo o valor de b para a e que uma mudana futura em b no afetar o valor de a.
Por exemplo, se usarmos esse cdigo (com a evoluo das variveis em cor verde):

int a = b = a = b =

a, b; 10; 4; b; 7;

// // // // //

a:? b:? a:10 b:? a:10 b:4 a:4 b:4 a:4 b:7

isso nos dar o resultado que o valor contido em a 4 e o valor contido em b 7. A modificao final de b no afetou a, mesmo sabendo que havamos declarado a = b; (regra da direita-para-esquerda).
Uma propriedade que C++ tem sobre outras linguagens de programao que a operao de atribuio pode ser usada como rvalue (ou parte de um rvalue) para outra atribuio. Por exemplo: a = 2 + (b = 5);

25

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

equivalente a:
b = 5; a = 2 + b;

isso significa: primeiro atribui 5 para a varivel b e ento atribui para a o valor 2 mais o resultado a atribuio anterior de b (que 5), deixando a com um valor final de 7. Assim, a seguinte expresso tambm vlida em C++:
a = b = c = 5;

atribui 5 s trs variveis: a, b e c. Operadores aritmticos ( +, -, *, /, % ) As cinco operaes aritmticas suportadas pela linguagem so: + Adio - Subtrao * Multiplicao / Diviso % Mdulo Operaes de adio, subtrao, multiplicao, e diviso no um desafio de entendimento para voc, j que elas correspondem literalmente com seus respectivos operadores matemticos.
O nico que pode no ser conhecido por voc o mdulo, especificado com o sinal de porcentagem (%). Mdulo a operao que d o resto de uma diviso de dois valores inteiros. Por exemplo, se escrevermos a = 11 % 3; a varivel a ir conter 2 como resultado j que 2 o resto da diviso de 11 por 3.

Operadores de atribuio compostos (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=) Uma caracterstica de atribuio em C++ que contribui para sua fama de boa escrita de linguagem so os operadores de atribuio compostos (+=, -=, *= e /= entre outros), que permitem modificar o valor de uma varivel com um dos operadores bsicos:
value += increase; equivalente a value = value + increase; a -= 5; equivalente a a = a - 5; a /= b; equivalente a a = a / b; price *= units + 1; equivalente a price = price * (units + 1);

e o mesmo para todas as outra operaes. 26

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

INCREMENTO E DECREMENTO. Outro exemplo de linguagem econmica ao digitar cdigo so os operadores de incremento (++) e os operadores de decremento (--). Eles aumentam ou reduzem 1 ao valor guardado na varivel. So equivalentes a +=1 e a -=1, respectivamente. Assim:
a++; a+=1; a=a+1;

so todos equivalentes e suas funcionalidades so incrementar 1 no valor de a.


Sua existncia devido ao fato de que nos primeiros compiladores de C, os trs exemplos anteriores produziam cdigo executvel diferente de acordo com qual deles fosse usado. Hoje em dia esse tipo de otimizao de cdigo geralmente feito automaticamente pelo compilador. Uma caracterstica desse operador que pode ser usado tanto como prefixo ou como sufixo. Isso significa que pode ser escrito antes do identificador da varivel (++a) ou depois (a++). Embora em expresses simples, como a++ ou ++a, eles tenham exatamente o mesmo significado, em outras operaes no qual o resultado da operao de incremento ou decremento avaliado como outra expresso eles podem ter uma diferena importante em seus significados: em caso do operador de incremento ser usado como prefixo (++a), o valor incrementado antes de a expresso ser avaliada e, sendo assim, o valor incrementado considerado na expresso; em caso de ser usado como sufixo (a++), o valor guardado em a incrementado depois de ter sido avaliada e, sendo assim, o valor guardado antes da operao de incremento avaliada na expresso. Note a diferena:

Exemplo 1
B=3; A=++B; // A 4, B 4

Exemplo 2
B=3; A=B++; // A 3, B 4

No Exemplo 1, B incrementado antes que seu valor seja copiado para A. Enquanto no Exemplo 2, o valor de B copiado para A e B incrementado depois. Operadores relacionais ( ==, !=, >, <, >=, <= ) Para que seja possvel avaliar uma comparao entre duas expresses, podemos usar os operadores relacionais. Conforme especificado no padro ANSI-C++, o resultado de uma operao relacional um valor bool que pode ser somente true ou false, de acordo com o resultado da comparao.
Ns podemos querer comparar duas expresses, por exemplo, para saber se elas so iguais ou se uma delas maior que a outra. Aqui est uma lista com os operadores relacionais que podem ser utilizados no C++:

27

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

== Igual a != Diferente de > Maior que < Menor que >= Maior ou igual a <= Menor ou igual a

Aqui voc tem alguns exemplos:


(7 == 5) Retornaria false. (5 > 4) Retornaria true. (3 != 2) Retornaria true. (6 >= 6) Retornaria true. (5 < 5) Retornaria false.

claro que, ao invs de usar somente constantes numricas, podemos usar qualquer expresso vlida, incluindo variveis. Suponha que a=2, b=3 e c=6, Retornaria false. Retornaria true j que (2*3 >= 6) verdadeiro. (b+4 > a*c) Retornaria false j que (3+4 > 2*6) falso. ((b=2) == a) Retornaria true.
(a == 5) (a*b >= c)

Fique atento: o operador = (um sinal de igual) no o mesmo que o operador == (dois sinais de igual), o primeiro um operador de atribuio (atribui o lado direito da expresso varivel da esquerda) e o outro (==) um operador relacional de igualdade que compara se as duas expresses nos dois lados do operador so iguais entre si. Assim, na ltima expresso ((b=2) == a), ns atribumos primeiramente o valor 2 a b e ento o comparamos com a, que tambm guarda o valor 2, ento o resultado da operao true. Em muitos compiladores feitos antes da publicao do padro ANSI-C++, assim como na linguagem C, as operaes relacionais no retornavam um valor bool true ou false, ao invs disso, retornavam um int como resultado com um valor 0 para representar "false" e um valor diferente de 0 (geralmente 1) para representar "true". Operadores lgicos ( !, &&, || ). O operador ! equivalente operao boleana NOT, possui somente um operando localizado direita, e a nica coisa que faz inverter o valor desse operando, gerando false se o operando for true e true se o operando for false. o mesmo que dizer que retorna o resultado oposto da avaliao do operando. Por exemplo:

28

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

!(5 == 5) Retorna false porque a expresso direita (5 == 5) seria true. !(6 <= 4) Retorna true porque (6 <= 4) seria false. !true !false

Retorna false. Retorna true.

Os operadores lgicos && e || so usados ao avaliar duas expresses para obter um resultado nico. Eles correspondem s operaes lgicas boleanas AND e OR respectivamente. Seus resultados dependem da relao entre seus dois operandos: Primeiro Segundo resultado resultado Operando Operando a && b a || b a b true true false false true false true false true false false false true true true false

Por exemplo:
( (5 == 5) && (3 > 6) ) retorna false ( ( (5 == 5) || (3 > 6)) retorna true ( true || false ). true && false ).

Operador condicional ( ? ). O operador condicional avalia uma expresso e retorna um valor diferente de acordo com a expresso avaliada, dependendo se for true ou false. Seu formato :
condio ? result1 : result2

se condio for true a expresso retornar result1, caso contrrio retornar result2. retorna 3 pois 7 no igual a 5. 7==5+2 ? 4 : 3 retorna 4 pois 7 igual a 5+2. 5>3 ? a : b retorna a, pois 5 maior que 3. a>b ? a : b retorna o maior deles, a ou b.
7==5 ? 4 : 3

Operadores de Bits ( &, |, ^, ~, <<, >> ). Operadores de Bits modificam as variveis considerando os bits que representam os valores que elas guardam, ou seja, suas representaes binrias. 29

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

op asm Descrio & AND AND lgico | ^ ~ OR OR lgico XOR eXclusive OR lgico NOT Complemento de um (inverso de bit)

<< SHL Deslizar esquerda >> SHR Deslizar direita

Operadores de converso de tipos explcita Operadores de converso de tipos nos permitem converter um dado de um determinado tipo para outro. H diversas maneiras para se fazer isso em C++, e a mais popular e compatvel com a linguagem C, preceder a expresso a ser convertida pelo novo tipo colocado entre parnteses ():
int i; float f = 3.14; i = (int) f;

O cdigo anterior converte um nmero real 3.14 para um valor inteiro (3). Aqui, o operador de converso de tipos foi (int). Outra maneira de se fazer isso em C++ usar a forma de construtor: precedendo a expresso a ser convertida pelo tipo e colocando a expresso entre parnteses:
i = int ( f );

As duas maneiras de converso de tipos so vlidas em C++. Alm disso, o ANSI-C++ adicionou novos operadores de converso de tipos mais especficos para programao orientada a objetos. sizeof() Esse operador aceita um parmetro, que pode ser tanto um tipo de varivel como uma prpria varivel, e retorna o tamanho daquele tipo ou objeto em bytes:
a = sizeof (char);

Isso ir retornar 1 a a porque char um tipo com tamanho de 1 byte. O valor retornado por sizeof uma constante, ento sempre determinado antes da execuo do programa. 30

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Outros operadores Mais a frente nesse tutorial iremos ver mais alguns operadores, como os que se referenciam a ponteiros ou os especficos para programao orientada a objetos. Cada um tratado em sua seo respectiva.

Prioridade de operadores
Ao se fazer expresses complexas com diversos operandos, podemos ter algumas dvidas sobre qual operando avaliado antes e qual avaliado depois. Por exemplo, nessa expresso:
a = 5 + 7 % 2

podemos questionar se realmente significa:


a = 5 + (7 % 2) com resultado 6, ou a = (5 + 7) % 2 com resultado 0

A resposta correta a primeira das duas expresses, com resultado 6. H uma ordem estabelecida com a prioridade de cada operador, e no somente os aritmticos (aqueles cuja preferncia possamos j saber devido a matemtica) mas para todos os operadores que possam aparecer em C++. Da prioridade maior para a menor, a ordem a seguinte:
Prioridade Operador :: 1 2 () [ ] -> . sizeof ++ -~ 3 ! & * (type) + 4 5 6 7 8 9 10 11 12 13 * / % + << >> < <= > >= == != & ^ | && || ?: Incremento/Decremento Complemento de um (bit) NOT unrio Referncia e Apontamento (ponteiros) Converso de tipo Sinal de menos unrio Operaes aritmticas Operaes aritmticas Deslizamento de bits Operadores relacionais Operadores relacionais Operadores de bits Operadores lgicos Condicional Esquerda Esquerda Esquerda Esquerda Esquerda Esquerda Esquerda Direita Direita Esquerda Direita Descrio Escopo Associatividade Esquerda Esquerda

= += -= *= /= %= Atribuio >>= <<= &= ^= |= , Vrgula, Separador

31

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Associativdade define caso haja diversos operadores do mesmo nvel de prioridade- qual ser avaliado primeiro, o que est mais direita ou o que est mais esquerda. Todos esses nveis de precedncia para operadores podem ser manipulados ou se tornarem mais legveis com o uso de parnteses ( e ), como nesse exemplo: a = 5 + 7 % 2;

pode ser escrito como:


a = 5 + (7 % 2); ou a = (5 + 7) % 2;

de acordo com a operao que queremos realizar.


Ento caso voc queira escrever uma expresso complicada e no tem certeza dos nveis de precedncia, sempre inclua parnteses. Provavelmente tambm ser um cdigo mais legvel.

32

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Estruturas de controle.
Um programa geralmente no limitado a uma sequncia linear de instrues. Durante o processo, pode bifurcar, repetir cdigo, ou tomar decises. Por esse motivo, C++ prov estruturas de controle que servem para especificar o que precisa ser feito para executar nosso programa. Com a introduo das sequncias de controle, teremos que introduzir um novo conceito: o bloco de instrues. Um bloco de instrues um grupo de instrues separado por pontose-vrgulas (;), mas agrupados em um bloco delimitado por sinais de chaves: { e }. A maioria das estruturas de controle que veremos nessa seo permite um contedo genrico como parmetro, isso se refere a uma nica instruo ou a um bloco de instrues, como quisermos. Se quisermos que o contedo seja uma nica instruo, no precisamos coloc-la entre chaves ({}). Se quisermos que o contedo seja mais que uma nica instruo, precisamos coloc-la entre chaves ({}) formando um bloco de instrues.

Estrutura condicional: if e else


usada para executar uma instruo ou bloco de instrues somente se uma condio for satisfeita. Sua forma :
if (condio) contedo

onde condio a expresso que est sendo avaliada. Se a condio for true, o contedo executado. Se for false, o contedo ignorado (no executado) e o programa continua na prxima instruo depois da estrutura condicional.
Por exemplo, o seguinte fragmento de cdigo imprime x e 100 somente se o valor guardado na varivel x for igual a 100: if (x == 100) cout << "x e 100";

Se quisermos que mais de uma nica instruo seja executada no caso da condio ser true, precisamos especificar um bloco de instrues usando chaves { }:
if (x == 100) { cout << "x e "; cout << x; }

33

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Podemos especificar tambm o que queremos que acontea caso a condio no seja satisfeita usando a palavra-chave else. Sua forma usada em conjunto com if : if (condio) contedo1 else contedo2

Por exemplo:
if (x == 100) cout << "x e 100"; else cout << "x nao e 100";

imprime na tela x e 100 se x for igual a 100, mas se no for e somente se no for- imprime x no
e 100. As estruturas if + else podem ser concatenadas com a inteno de verificar um intervalo de valores. O seguinte exemplo mostra seu uso dizendo se o valor presente guardado em x positivo, negativo ou nenhum dos anteriores, ou seja, igual a zero. if (x > 0)

cout << "x e positivo"; else if (x < 0) cout << "x e negativo"; else cout << "x e 0";

Lembre-se que caso queiramos que mais de uma nica instruo seja executada, precisamos agruplas em um bloco de instrues usando chaves { }.

34

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Estruturas repetitivas ou loops


Loops tem como objetivo repetir um contedo um certo nmero de vezes ou enquanto uma condio seja satisfeita. O LOOP WHILE. Seu formato :
while (expresso) contedo

e sua funo simplesmente repetir o contedo enquanto a expresso for verdadeira.


Por exemplo, iremos fazer um programa que faz uma contagem regressiva usando um loop while: // contagem regressiva customizada usando while #include <iostream> int main () { int n; cout << "Entre com o numero inicial "; cin >> n; while (n>0) { cout << n << ", "; --n; } cout << "FOGO!"; return 0; } Entre com o numero inicial > 8 8, 7, 6, 5, 4, 3, 2, 1, FOGO!

Quando o programa inicia, pedido ao usurio que insira um nmero inicial para a contagem regressiva. Ento quando o loop while inicia, se o valor entrado pelo usurio satisfizer a condio n>0 (de que n maior que 0 ), o bloco de instrues seguinte ser executado um nmero indefinido de vezes enquanto a condio (n>0) permanecer verdadeira. Todo o processo no programa acima pode ser interpretado de acordo com o seguinte script: iniciando em main:

1. O usurio atribui um valor para n. 2. A instruo while checa se (n>0). Nesse ponto h duas possibilidades:
o o

true: executa o contedo (passo 3,) false: pula o contedo. O programa segue para o passo 5..

35

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

3. Executa o contedo:
cout << n << ", "; --n;

(imprime n na tela e decrementa 1 de n).


4. Fim do bloco. Retorna automaticamente ao passo 2. 5. Continua o programa depois do bloco: imprime FOGO! e termina o programa.

Precisamos considerar que o loop precisa terminar alguma hora, sendo assim, dentro do bloco de instrues (o contedo do loop) precisamos prover algum mtodo que fora a condio a se tornar falsa em algum momento, ou em caso contrrio, o loop continuar se repetindo para sempre. Nesse caso ns inclumos --n; que faz com que a condio se torne false depois de algumas repeties de loop: quando n se torna 0, que quando nossa contagem regressiva termina. claro que essa uma ao bastante simples para nosso computador que toda a contagem regressiva feita de maneira instantnea sem um atraso prtico entre os nmeros.

O LOOP DO-WHILE. Formato:


do contedo while (condio);

Sua funcionalidade exatamente a mesma que a do loop while, com exceo que a condio do do-while avaliada depois da execuo da contedo ao invs de antes, garantindo pelo menos uma execuo do contedo mesmo se a condio nunca for satisfeita. Por exemplo, o seguinte programa repete qualquer nmero que voc entre, at que voc entre 0.
// repetidor de nmero #include <iostream> int main () { unsigned long n; do { cout << "Entre com um numero (0 para sair): "; cin >> n; cout << "Voc entrou o numero: " << n << "\n"; } while (n != 0); return 0; } Entre com um numero (0 para sair): 12345 Voc entrou o numero: 12345 Entre com um numero (0 para sair): 160277 Voc entrou o numero: 160277 Entre com um numero (0 para sair): 0 Voc entrou o numero: 0

36

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

O loop do-while geralmente usado quando a condio que determina se chegou ao fim est dentro do contedo do loop, como no caso anterior, no qual a entrada do usurio dentro do bloco de instrues o que determinar o fim do loop. Se voc nunca entrar com o valor 0 no exemplo anterior, o loop no terminar nunca.

O LOOP FOR. Seu formato s:


for (inicializao; condio; incremento) contedo;

e sua principal funo repetir o contedo enquanto a condio permanecer verdadeira, como no loop while. Mas, alm disso, o for prov lugares para especificar a instruo de inicializao e a instruo de incremento. Ento esse loop projetado especialmente para realizar uma ao repetitiva com um contador.
Funciona da seguinte maneira:

1, a inicializao executada. Geralmente a configurao de um valor inicial para um contador. executado somente uma vez. 2, a condio checada, se for true o loop continua, caso contrrio o loop termina e o contedo pulado. 3, o contedo executado. Como sempre, pode ser tanto uma nica instruo ou um bloco de instrues colocadas entre chaves { }. 4, finalmente, o que quer que seja que estiver especificado no campo de incremento, executado e o loop volta ao passo 2. Aqui est um exemplo de contagem regressiva usando o loop for.
// ccontagem regressiva usando um loop for #include <iostream> int main () { for (int n=10; n>0; n--) { cout << n << ", "; } cout << "FOGO!"; return 0; } 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FOGO!

Os campos de inicializao e de incremento so opcionais. Eles podem ser evitados, mas no os pontos-e-vrgulas dentre eles. Por exemplo, poderamos escrever: for (;n<10;) se no quisssemos especificar nenhuma inicializao nem incremento; ou for (;n<10;n++) se quisssemos incluir um campo de incremento, mas no uma inicializao.

37

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Opcionalmente, usando uma vrgula (,), podemos especificar mais de uma instruo em qualquer dos campos inclusos em um loop for, como na inicializao, por exemplo. A vrgula (,) um separador de instruo, e serve para separar mais de uma instruo quando somente uma instruo esperada. Por exemplo, suponha que queiramos inicializar mais de uma varivel em nosso loop:

for ( n=0, i=100 ; n!=i ; n++, i-- ) { // qualquer coisa aqui... }

O loop ir executar 50 vezes caso nenhuma das variveis n ou i sejam modificadas dentro do loop:

n comea com 0 e i com 100, a condio (n!=i) (que n no seja igual a i). Devido ao fato de n ser incrementado por um e i decrementado por um, a condio do loop se tornar false depois do 50 loop, quando ambas n e i forem iguais a 50.

Bifurcao de controles e pulos.


A INSTRUO BREAK. Usando break, podemos deixar um loop mesmo que a condio para o fim no seja satisfeita. Pode ser usado para terminar um loop infinito, ou for-lo a terminar antes de seu trmino natural. Por exemplo, iremos terminar a contagem regressiva antes que termine naturalmente (uma falha no mecanismo talvez):
// exemplo de loop com break #include <iostream> int main () { int n; for (n=10; n>0; n--) { cout << n << ", "; if (n==3) { cout<<"contagem regressiva abortada!"; break; } } return 0; } 10, 9, 8, 7, 6, 5, 4, 3, contagem regressiva abortada!

38

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

A INSTRUO CONTINUE. A instruo continue faz com que o programa ignore o resto do loop na iterao presente como se o final do bloco de contedo tivesse sido alcanado, fazendo com que v para a prxima iterao. Por exemplo, iremos ignorar o nmero 5 em nossa contagem regressiva:
// exemplo de loop com continue #include <iostream> int main () { for (int n=10; n>0; n--) { if (n==5) continue; cout << n << ", "; } cout << "FOGO!"; return 0; } 10, 9, 8, 7, 6, 4, 3, 2, 1, FOGO!

A INSTRUO GOTO. Permite fazer um pulo absoluto para outro ponto do programa. Voc deve usar essa caracterstica com cuidado h que sua execuo ignora qualquer tipo de limitao de aninhamento.
O ponto de destino identificado por uma etiqueta, no qual usado como argumento para a instruo goto. Uma etiqueta feita de um identificador vlido seguido por dois pontos (:). Essa instruo no tem uma utilidade concreta em programao estruturada ou orientada a objetos alm das que o fs de programao de baixo nvel possam encontrar para ela. Por exemplo, aqui est nosso loop de contagem regressiva usando goto: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FOGO!

// exemplo de loop com goto #include <iostream> int main () { int n=10; loop: cout << n << ", "; n--; if (n>0) goto loop; cout << "FOGO!"; return 0; }

39

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

A FUNO EXIT. exit uma funo definida na bilioteca cstdlib (stdlib.h).


O propsito de exit terminar um programa em execuo com um cdigo de sada especfico. Seu prottipo : void exit (int cdigo de sada);

O cdigo de sada usado por alguns sistemas operacionais e pode ser usado para chamar programas. Por conveno, um cdigo de 0 significa que o programa terminou normalmente e qualquer outro valor significa que um erro aconteceu.

A estrutura seletiva: switch.


A sintaxe da instruo switch um pouco peculiar. Seu objetivo checar diversos valores constantes possveis para uma expresso, algo parecido com o que fizemos no incio dessa seo com a juno de diversos comandos if e else if. Sua forma a seguinte:
switch (expresso) { case constante1: bloco de instrues 1 break; case constante2: bloco de instrues 2 break; . . . default: bloco de instrues padro }

Funciona da seguinte maneira: o switch avalia a expresso e checa se equivalente constante1, e se for, executa o bloco de instrues 1 at achar a palavra-chave break, ento o programa ir pular para o fim da estrutura seletiva switch.

40

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Se a expresso no for igual constante1, ir checar se a expresso equivalente constante2. E se for, ir executar o bloco de instrues 2 at achar a palavra-chave break. Finalmente, de o valor da expresso no foi equivalente nenhuma constante especificada anteriormente (voc pode especificar quantos comandos case como valores voc quiser), o programa ir executar as instrues includas na seo default: se existir, j que opcional.
Ambos os fragmentos de cdigo seguintes so equivalentes:

Exemplo de switch
switch (x) { case 1: cout << "x e 1"; break; case 2: cout << "x e 2"; break; default: cout << "valor de x desconhecido"; }

if-else equivalente
if (x == 1) { cout << "x e 1"; } else if (x == 2) { cout << "x e 2"; } else { cout << "valor de x desconhecido"; }

Eu comentei anteriormente que a sintaxe da instruo switch um pouco peculiar. Note a incluso da instruo break no final de cada bloco. Isso necessrio porque se, por exemplo, no a inclussemos no bloco de instrues 1, o programa no iria pular para o final do bloco seletivo switch (}) e continuaria executando o resto dos blocos de instrues at que a instruo break aparecesse pela primeira vez ou chegasse ao fim do bloco seletivo switch. Isso faz com que seja desnecessrio incluir chaves { } em cada um dos casos, e tambm pode ser til para executar o mesmo bloco de instrues para valores possivelmente diferentes da expresso avaliada. Por exemplo: switch (x) { case 1: case 2: case 3: cout << "x e 1, 2 ou 3"; break; default: cout << "x nao e 1, 2 nem 3"; }

Note que o switch s pode ser usado para comparar uma expresso com constantes diferentes. Sendo assim, no podemos colocar variveis (case (n*2):) ou intervalos (case (1..3):) porque no so constantes vlidas.
Se precisar checar intervalos ou valores que no so constantes, use uma concatenao de comandos if e else if.

41

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

STRINGS DE CARACTERES.
Em todos os programas vistos at agora, ns usamos somente variveis numricas, usadas para expressar nmeros exclusivamente. Mas alm de variveis numricas tambm existem strings de caracteres, que nos permitem representar sucesses de caracteres, como palavras, frases, nomes, texto, etc. At agora ns somente as usamos como constantes, mas nunca consideramos variveis capazes de cont-las. Em C++ no h um tipo de varivel elementar especfico que guarde strings de caracteres. Para satisfazer essa necessidade, precisamos usar matrizes do tipo char, que so sucesses de elementos char. Lembre que o tipo de dados (char) o tipo usado para guardar um nico caractere, e por esse motivo, matrizes dele so geralmente usadas para fazer strings de caracteres nicos. Por exemplo, a seguinte matriz (ou string de caracteres):
char jenny [20];

pode guardar uma string com at 20 caracteres de comprimento. Voc pode imaginar isso assim:

O tamanho mximo de 20 caracteres no preciso ser sempre usado completamente. Por exemplo, jenny poderia guardar em algum momento do programa ou a string de caracteres "Hello" ou a string "Merry christmas". Sendo assim, como a matriz de caracteres pode guardar strings mais curtas que seu tamanho total, uma conveno foi feita para terminar o contedo vlido de uma string com um caractere nulo, no qual a constante pode se escrita como 0 ou como '\0'. Ns poderamos representar jenny (uma matriz de 20 elementos do tipo char) guardando as strings de caracteres "Hello" e "Merry Christmas" da seguinte maneira:

Note como depois do contedo vlido um caractere nulo ('\0') incluso para que possa indica o final da string. Os painis em cor cinza representam valores indeterminados.

Inicializao de strings
Devido ao fato de as strings de caracteres serem matrizes ordinrias, elas possuem todas as mesmas regras. Por exemplo, se quisermos inicializar uma string de caracteres com valores prdeterminados, podemos fazer simplesmente como qualquer outra matriz:

42

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

Nesse caso, ns declaramos uma string de caracteres (matriz) com 6 elementos do tipo char inicializada com os caracteres que compem Hello mais um caractere nulo '\0'. De qualquer maneira, strings de caracteres possuem uma maneira adicional para inicializar seus valores: usando strings constantes. Nas expresses que usamos em exemplos nos captulos anteriores, constantes que representam strings de caracteres inteiras j apareceram algumas vezes. Essas constantes so especificadas entre aspas duplas ("), por exemplo:
"o resultado e: "

uma string constante que provavelmente j usamos em alguma ocasio. Diferentemente de aspas simples (') que especificam constantes com um nico caractere, as aspas duplas (") so constantes que especificam uma sucesso de caracteres. Strings colocadas entre aspas duplas possuem sempre um caractere nulo ('\0') que colocado automaticamente no final. Sendo assim, poderamos inicializar a string mystring com valores de qualquer uma dessas maneiras:
char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' }; char mystring [] = "Hello";

Em ambos os casos, a matriz ou string de caracteres mystring declarada com um tamanho de 6 caracteres (elementos do tipo char): os 5 caracteres que compem Hello mais um caractere nulo no final ('\0') que especifica o fim da string e que, no segundo caso, ao usar aspas duplas (") colocado automaticamente. Antes de continuarmos, note que a atribuio de constantes mltiplas como constantes com aspas duplas (") para matrizes somente vlida na inicializao da matriz, que no momento em que declarada. Expresses dentro do cdigo como:
mystring = "Hello"; mystring[] = "Hello";

no so vlidas para matrizes, como tambm no seria vlido:


mystring = { 'H', 'e', 'l', 'l', 'o', '\0' };

Ento lembre-se: Podemos "atribuir" uma constante mltipla para uma matriz somente no momento de sua inicializao. A razo disso ser mais compreensvel quando voc souber um pouco mais sobre ponteiros, pois ser explicado que uma matriz simplesmente um ponteiro constante apontando para um bloco de memria alocado. E devido ao fato de ser constante, a matriz no pode se atribuir qualquer valor, mas podemos atribuir valores para cada um dos elementos da matriz. O momento de inicializao de uma matriz um caso especial, pois no uma atribuio, embora o mesmo sinal de igual (=) seja usado. De qualquer maneira, tenha sempre presente a regra sublinhada anteriormente.

43

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Assigning values to strings


Como o lvalue de uma atribuio s pode um elemento de uma matriz e no a matriz inteira, seria vlido atribuir uma string de caracteres para uma matriz de char usando um mtodo como esse:
mystring[0] mystring[1] mystring[2] mystring[3] mystring[4] mystring[5] = = = = = = 'H'; 'e'; 'l'; 'l'; 'o'; '\0';

Mas como voc pode imaginar, esse no parece ser um mtodo muito prtico. Em geral, para atribuir valores para uma matriz, e mais especificamente para uma string de caracteres, uma srie de funes como strcpy so usadas. strcpy (string copy cpia de string) definida na biblioteca cstring (string.h) e pode ser chamada da seguinte maneira:
strcpy (string1, string2); Isso copia o contedo da string2 para a string1. string2 pode ser tanto uma matriz, um

ponteiro, ou uma string constante, ento a seguinte linha seria uma maneira vlida de se atribuir uma string constante "Hello" para mystring:
strcpy (mystring, "Hello");

Por exemplo:
// atribuindo valor a string #include <iostream> #include <cstring> int main() { char szMyName [20]; strcpy (szMyName,"J. Soulie"); cout << szMyName; return 0; } J. Soulie

Note que precisamos incluir o cabealho <cstring> para podermos usar a funo strcpy. Mesmo assim, sempre podemos escrever uma simples funo como a seguinte setstring com a mesma operao que a strcpy de cstring:
// setting value to string #include <iostream> void setstring (char szOut [], szIn []) { int n=0; do { szOut[n] = szIn[n]; } while (szIn[n++] != '\0'); } char J. Soulie

44

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

int main () { char szMyName [20]; setstring (szMyName,"J. Soulie"); cout << szMyName; return 0; }

Outro mtodo usado frequentemente para atribuir valores a matrizes usar o comando de entrada (cin) diretamente. Nesse caso, o valor da string atribudo pelo usurio durante a execuo do programa. Quando o cin usado com strings de caracteres, geralmente usado com seu mtodo getline, que pode ser chamado de acordo com esse prottipo:
cin.getline ( char buffer[], int tamanho, char delimitador = ' \n'); no qual buffer o endereo de onde guardar a entrada (como uma matriz, por exemplo), tamanho o tamanho mximo do buffer (o tamanho da matriz) e delimitador o caractere usado para

determinar o final da entrada do usurio, que por padro se no inclurmos esse parmetro ser o caractere de nova linha ('\n'). O seguinte exemplo repete qualquer coisa que voc digite em seu teclado. simples, mas serve como um exemplo de como voc pode usar cin.getline com strings:
// cin com strings #include <iostream> int main () { char mybuffer [100]; cout << "Qual o seu nome? "; cin.getline (mybuffer,100); cout << "Ola " << mybuffer << ".\n"; cout << "Qual o seu time favorito? "; cin.getline (mybuffer,100); cout << "Eu gosto do " << mybuffer << " tambm.\n"; return 0; } Qual o seu nome? Juan Ola Juan. Qual o seu time favorito? Inter Milan Eu gosto do Inter Milan tambm.

Note como em ambas as chamadas a cin.getline ns usamos o mesmo identificador de string (mybuffer). O que o programa faz na segunda chamada simplesmente sobrescrever o contedo prvio de buffer com o nome que introduzido. Se voc se lembrar da seo sobre comunicao pelo console, voc se lembrar que usamos o operador de extrao (>>) para receber dados diretamente da entrada padro. Esse mtodo tambm pode ser usado ao invs de cin.getline com strings de caracteres. Por exemplo, em nosso programa, quando requisitamos uma entrada de usurio, poderamos ter escrito:

45

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

cin >> mybuffer;

isso funcionaria, mas esse mtodo tem as seguintes limitaes que o cin.getline no tem:

S pode receber palavras nicas (sem frases completas) pois esse mtodo usa como delimitador qualquer ocorrncia de caractere vazio, incluindo espaos, tabulaes, novas linhas e retornos de carro. No permitido especificar um tamanho para o buffer. Isso deixa seu programa instvel em caso da entrada do usurio ser maior que a matriz que ir guard-la.

Por essas razes, recomendado que sempre que voc requerer strings de caracteres vindos de cin, voc use cin.getline ao invs de cin >>.

Convero de strings para outros tipos


Devido ao fato de uma string poder conter representaes de outros tipos de dados como nmeros, pode ser til traduzir o contedo para uma varivel de tipo numrico. Por exemplo, uma string pode conter "1977", mas essa uma sequncia de 5 caracteres que no so convertidos facilmente para um nico tipo de dado inteiro. A biblioteca cstdlib (stdlib.h) prov trs funes teis para isso:

atoi: converte string para o tipo int. atol: converte string para o tipo long. atof: converte string para o tipo float.

Todas essas funes admitem um parmetro e retornam um valor do tipo requisitado (int, long ou float). Essas funes combinadas com o mtodo getline de cin so uma maneira mais confivel de pegar a entrada do usurio ao requisitar um nmero que o clssico mtodo cin>> :
// cin and ato* functions #include <iostream> #include <stdlib.h> int main() { char mybuffer [100]; float price; int quantity; cout << "Entre com o preco: "; cin.getline (mybuffer,100); price = atof (mybuffer); cout << "Entre com a quantidade: "; cin.getline (mybuffer,100); quantity = atoi (mybuffer); cout << "Preco total: " << price*quantity; return 0; } Entre com o preco: 2.75 Entre com a quantidade: 21 Preco total: 57.75

46

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Funes para manipular strings


A biblioteca cstring (string.h) define muitas funes para manipular operaes com strings tipoC (como a strcpy que j foi explicada). Aqui voc tem uma breve descrio das mais usuais: strcat: char* strcat (char* dest, const char* src); Adiciona a string src no final da string dest. Retorna dest. strcmp: int strcmp (const char* string1, const char* string2); Compara as strings string1 e string2. Retorna 0 se ambas as strings forem iguais. strcpy: char* strcpy (char* dest, const char* src); Copia o contedo de src para dest. Retorna dest. strlen: size_t strlen (const char* string); Retorna o tamanho da string. NOTA: char* o mesmo que char[]

47

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

MATRIZES
Matriz uma srie de elementos (variveis) do mesmo tipo alocadas consecutivamente na memria que podem ser referenciados individualmente adicionando-se um ndice a um nome nico. Isso significa que, por exemplo, podemos guardar 5 valores do tipo int sem ter que declarar 5 variveis diferentes cada uma com um identificado diferente. Ao invs disso, usando uma matriz, podemos guardar cinco valores diferentes do mesmo tipo, int, por exemplo, com um identificador nico. Por exemplo, uma matriz que contm 5 valores inteiros do tipo int chamada billy poderia ser representada dessa maneira:

onde cada painel em branco representa um elemento da matriz, que nessa caso so valores inteiros do tipo int. Esses so numerados de 0 at 4, pois em matrizes o primeiro ndice sempre 0, independentemente de seu tamanho.
Como qualquer outra varivel, uma matriz precisa ser declarada antes de ser usada. Uma declarao tpica de uma matriz em C++ : tipo nome [elementos];

onde tipo um tipo de objeto vlido (int, float...), nome um identificador de varivel vlido e o campo elementos, que est entre colchetes [], especifica quantos desses elementos a matriz contm.
Sendo assim, para declarar billy como mostrado acima, to simples quanto o comando a seguir: int billy [5];

NOTA: O campo elementos dentro de colchetes [] ao declarar uma matriz precisa ser um valor constante, pois matrizes so blocos de memria esttica de um dado tamanho e o compilador precisa ser capaz de determinar exatamente quanta memria precisa atribuir para a matriz antes que qualquer instruo seja considerada.

48

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Inicializao de matrizes.
Ao declarar uma matriz de escopo local (dentro de uma funo), se no especificarmos nada, no ser inicializada, ento seu contedo ser indeterminado at que guardemos alguns valores nela.
Se declararmos uma matriz global (fora de qualquer funo) seu contedo ser inicializado com todos seus elementos preenchidos com zeros. Assim, se declararmos em um escopo global: int billy [5];

todos os elementos de billy sero preenchidos inicialmente com 0. Mas, alm disso, quando declaramos uma matriz, temos a possibilidade de atribuir valores iniciais para cada um de seus elementos usando chaves { }. Por exemplo:
int billy [5] = { 16, 2, 77, 40, 12071 };

essa declarao teria criado uma matriz como a seguinte:

O nmero de elementos em uma matriz que inicializamos dentro das chaves { } precisa estar de acordo com o tamanho de elementos que declaramos para a matriz dentro dos colchetes [ ]. Por exemplo, no exemplo da matriz billy, ns declaramos que tinha 5 elementos e na lista de valores iniciais dentro das chaves { } ns preenchemos com 5 valores diferentes, um para cada elemento. Devido ao fato disso ser considerado uma repetio intil, o C++ inclui a possibilidade de deixar os colchetes vazios [ ] e o tamanho da matriz ser definido pelo nmero de valores inclusos entre chaves { }:
int billy [] = { 16, 2, 77, 40, 12071 };

Acesso aos valores de uma Matriz.


Em qualquer parte do programa no qual a matriz visvel, podemos acessar qualquer de seus valores individualmente para leitura ou modificao como se fosse uma varivel normal. O formato o seguinte:
nome[ndice]

49

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

De acordo com os exemplos anteriores no qual billy tinha 5 elementos e cada um desses elementos eram do tipo int, os nomes que podemos usar para nos referenciar a cada elemento so os seguintes:

Por exemplo, para guardar o valor 75 no terceiro elemento de billy, um comando aceitvel seria esse:
billy[2] = 75;

e, por exemplo, para passar o valor do terceiro elemento de billy para uma varivel a, poderamos digitar:
a = billy[2];

Sendo assim, para todos os propsitos, a expresso billy[2] como qualquer outra varivel de tipo int.
Note que o terceiro elemento de billy especificado como billy[2], pois o primeiro elemento billy[0], o segundo billy[1], e sendo assim, o terceiro billy[2]. Pela mesma razo, seu ltimo elemento billy[4]. Pois se escrevssemos billy[5], estaramos nos referenciando ao sexto elemento de billy e ento excedendo o tamanho da matriz. Em C++ perfeitamente vlido exceder o limite vlido de ndices para uma matriz, o que pode causar problemas pois eles no causam erros de compilao, mas podem causar resultados inesperados ou erros srios durante a execuo. A razo pela qual isso permitido ser vista mais a frente quando comearmos a usar ponteiros. At aqui importante ser capaz de distinguir claramente entre os dois usos que os colchetes [ ] tem relacionados s matrizes. Eles desempenham duas tarefas diferentes: uma configurar o tamanho das matrizes ao declar-las; e a segunda especificar ndices para um elemento concreto da matriz ao se referenciar a ele. Precisamos simplesmente tomar cuidado para no confundir esses dois possveis usos de colchetes [ ] com matrizes:

int billy[5];

// declarao de uma nova matriz (comea com um tipo nome)

billy[2] = 75; // acesso a um elemento da matriz. Outros operadores vlidos com matrizes: billy[0] = a; billy[a] = 75; b = billy [a+2]; billy[billy[a]] = billy[2] + 5;

50

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

// exemplo de matrizes #include <iostream> int billy [] = {16, 2, 77, 40, 12071}; int n, result=0; int main () { for ( n=0 ; n<5 ; n++ ) { result += billy[n]; } cout << result; return 0; }

12206

Matrizes multidimensionais
Matrizes multidimensionais podem ser descritas como matrizes de matrizes. Por exemplo, uma matriz bidimensional pode ser imaginada como uma tabela bidimensional de um tipo de dados concreto uniforme:

jimmy representa uma matriz bidimensional de 3 por 5 valores do tipo int. O

maneira de se declarar essa matriz seria:


int jimmy [3][5];

e, por exemplo, a maneira de referenciar o segundo elemento verticalmente e o quarto horizontalmente em uma expresso seria:
jimmy[1][3]

(lembre-se que ndices de matriz sempre comeam por 0). Matrizes multidimensionais no so limitadas a dois ndices (duas dimenses). Elas podem conter quantos ndices forem necessrios, embora seja raro ter 51

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

que representar mais que 3 dimenses. Apenas considere a quantidade de memria que uma matriz com muitos ndices pode precisar. Por exemplo:
char century [100][365][24][60][60];

atribui um char para cada segundo contido em um sculo, que mais que 3 bilhes de chars! Isso consumiria algo em torno de 3000 megabytes de memria RAM se pudssemos declarar.
Matrizes multidimensionais no so nada mais que uma abstrao, pois que podemos obter os mesmo resultados com uma matriz simples simplesmente colocando um fator entre os ndices: int jimmy [3][5]; int jimmy [15];

equivalente a (3 * 5 = 15)

com a nica diferena que o compilador nos lembra a profundidade de cada dimenso imaginria. Servem como exemplo esses dois pedaos de cdigo, com exatamente o mesmo resultado, um usando matriz bidimensional, e o outro usando somente uma matriz simples:
// matriz multidimensional #include <iostream> #define WIDTH 5 #define HEIGHT 3 int jimmy [HEIGHT][WIDTH]; int n,m; int main () { for (n=0;n<HEIGHT;n++) for (m=0;m<WIDTH;m++) { jimmy[n][m]=(n+1)*(m+1); } return 0; } // matriz pseudo-multidimensional #include <iostream.h> #define WIDTH 5 #define HEIGHT 3 int jimmy [HEIGHT * WIDTH]; int n,m; int main () { for (n=0;n<HEIGHT;n++) for (m=0;m<WIDTH;m++) { jimmy[n * WIDTH + m]=(n+1)*(m+1); } return 0; }

nenhum dos programas acima produz nenhuma sada na tela, mas ambos atribuem valores ao bloco de memria chamado jimmy da seguinte maneira:

52

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Ns usamos constantes definidas (#define) para simplificar futuras modificaes possveis do programa. Por exemplo, em caso de decidirmos aumentar a matriz para uma altura de 4 ao invs de 3 podemos faze mudando a linha:
#define HEIGHT 3

para
#define HEIGHT 4

sem a necessidade de fazer nenhuma outra modificao ao programa.

Matrizes como parmetros


Em algum momento podemos precisar passar uma matriz para uma funo como parmetro. Em C++ no possvel passar por valor um bloco de memria completo como parmetro para uma funo, mesmo que esteja ordenado como uma matriz, mas permitido passar seu endereo. Isso tem quase o mesmo efeito prtico e uma operao muito mais rpida e eficiente.
Para se admitir matrizes como parmetros, a nica coisa que precisamos fazer ao declarar a funo especificar no argumento o type base para a matriz, um identificador e um par de colchetes vazios []. Por exemplo, a seguinte funo: void procedure (int arg[])

admite um parmetro do tipo "matriz de int" chamado arg. Para passar para essa funo uma matriz declarada como:
int myarray [40];

seria suficiente escrever uma chamada como essa:


procedure (myarray);

53

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Aqui voc tem um exemplo completo: // matrizes como parmetros #include <iostream> void printarray (int arg[], int length) { for (int n=0; n<length; n++) cout << arg[n] << " "; cout << "\n"; } int main () { int firstarray[] = {5, 10, 15}; int secondarray[] = {2, 4, 6, 8, 10}; printarray (firstarray,3); printarray (secondarray,5); return 0; } Como voc pode ver, o primeiro argumento (int arg[]) admite qualquer matriz do tipo int, seja qual for seu tamanho. Por esse motivo ns inclumos um segundo parmetro que diz para a funo o tamanho de cada matriz que est sendo passada a ela como o primeiro parmetro. Isso permite que o loop for, que imprime a matriz, saiba o intervalo da matriz passada a ser checado. Em uma declarao de funo tambm possvel incluir matrizes multidimensionais. O formato para uma matriz tridimensional : tipo_base[][profundidade][profundidade] 5 10 15 2 4 6 8 10

por exemplo, uma funo com uma matriz multidimensional como argumento poderia ser:
void procedure (int myarray[][3][4])

note que os primeiros colchetes [] esto vazios e os seguintes no esto. Isso precisa ser sempre assim porque o compilador precisa saber determinar dentro da funo qual a profundidade de cada dimenso adicional. Matrizes, tanto simples quanto multidimensionais, passadas como parmetro de funes so uma fonte de erros comum para programadores com pouca experincia. Eu recomendo a leitura do captulo 3.3, Ponteiros para um entendimento melhor de como as matrizes operam.

54

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

FUNES
Uma funo um bloco de instrues que executado quando chamada de algum outro ponto do programa. Seu formato o seguinte: tipo nome ( argumento1, argumento2, ...) contedo no qual: tipo o tipo de dados que a funo retorna. nome o nome pelo qual ser possvel chamar a funo. argumentos (podem ser especificados quantos voc quiser). Cada argumento consiste em um tipo de dados seguido pelo seu identificador, como na declarao de uma varivel (por exemplo, int x) e que funciona dentro da funo como qualquer outra varivel. Eles permitem a passagem de parmetros para a funo quando chamada. Os parmetros diferentes so separados por vrgulas. contedo o corpo da funo. Pode ser uma nica instruo ou um bloco de instrues. No ltimo caso, precisa ser delimitado por chaves {}. Aqui voc tem o primeiro exemplo de funo: // exemplo de funo #include <iostream> int adicao (int a, int b) { int r; r=a+b; return (r); } int main () { int z; z = adicao (5,3); cout << "O resultado e " << z; return 0; } Para que se possa analisar esse cdigo, primeiro de tudo lembre-se de algo que foi dito no incio desse tutorial: um programa em C++ sempre comea sua execuo pela funo main. Ento iniciaremos por ela. Podemos ver como a funo main comea declarando a varivel z do tipo int. Logo depois disso, vemos uma chamada para a funo addition. Se prestarmos ateno, veremos a semelhana entre a estrutura da chamada da funo com a prpria declarao da funo nas linhas de cdigo acima: O resultado e 8

55

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Os parmetros tm uma correspondncia clara. Dentro da funo main, chamamos a addition passando dois valores: 5 e 3 que correspondem aos parmetros int a e int b declarados para a funo addition.
No momento que a funo chamada em main, o controle perdido por main e passado para a funo addition. O valor de ambos os parmetros passados na chamada (5 e 3) so copiados nas variveis locais int a e int b dentro da funo. A funo addition declara uma nova varivel (int r;), e atravs da expresso r=a+b;, atribui a r o resultado de a mais b. Devido ao fato dos parmetros passados para a e b serem 5 e 3 respectivamente, o resultado 8. A seguinte linha de cdigo: return (r);

finaliza a funo addition, e devolve o controle para a funo que a chamou (main) continuando o programa do mesmo ponto que foi interrompido pela chamada a addition. Alm disso, return foi chamado com o contedo da varivel r (return (r);), que naquele momento era 8, ento esse foi o valor retornado pela funo.

O valor retornado por uma funo o valor dado para a funo quando avaliada. Sendo assim, z ir guardar o valor retornado por addition (5, 3), que 8. Para explicar isso de outra maneira, voc pode imaginar que a chamada para a funo (addition (5,3)) substituda literalmente pelo valor que retorna (8).
A seguinte linha de cdigo em main : cout << "O resultado e " << z;

que, como voc j deve saber, faz a impresso do resultado na tela. Escopo de variveis
Voc precisa considerar que o escopo de variveis declaradas dentro de uma funo ou qualquer outro bloco de instrues somente da prpria funo ou do prprio bloco de instrues e no podem ser usadas fora deles. Por exemplo, no exemplo anterior teria sido impossvel usar as variveis a, b ou r diretamente na funo main, pois eram variveis locais da funo addition. E tambm teria sido impossvel usar a varivel z diretamente dentro da funo addition, pois era uma varivel local

56

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

da funo main.

Sendo assim, o escopo de variveis locais limitado ao mesmo nvel de aninhamento no qual elas so declaradas. Mesmo assim voc tambm pode declarar variveis globais que so visveis em qualquer parte do cdigo, dentro ou fora de qualquer funo. Para declarar variveis globais, voc precisa fazlo fora de qualquer funo ou bloco de instrues, ou seja, diretamente no corpo do programa.

E aqui est outro exemplo sobre funes: // exemplo de funo #include <iostream> int subtraction (int a, int b) { int r; r=a-b; return (r); } int main () { int x=5, y=3, z; z = subtraction (7,2); cout << "O primeiro resultado e " << z << '\n'; cout << "O segundo resultado e " << subtraction (7,2) << '\n'; cout << "O terceiro resultado e " << subtraction (x,y) << '\n'; z= 4 + subtraction (x,y); cout << "O quarto resultado e " << z << '\n'; return 0; } O primeiro resultado e 5 O segundo resultado e 5 O terceiro resultado e 2 O quarto resultado e 6

57

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Nesse caso ns criamos a funo subtraction. A nica coisa que essa funo faz subtrair ambos os parmetros passados e retornar o resultado. Mesmo assim, se analisarmos a funo main, veremos que fizemos algumas chamadas funo subtraction. Ns usamos alguns mtodos de chamada diferentes para que voc veja outra maneira ou momentos que uma funo pode ser chamada. Para entender bem esses exemplos, voc precisa considerar novamente que uma chamada uma funo poderia ser substitudo perfeitamente por seu valor de retorno. Por exemplo, o primeiro caso (que voc j deve saber porque o mesmo padro que usamos em exemplo anteriores): z = subtraction (7,2); cout << "O primeiro resultado e " << z;

Se substituirmos a chamada da funo por seu resultado (que 5), teramos:


z = 5; cout << "O primeiro resultado e " << z; Assim como cout << "O segundo resultado e " << subtraction (7,2);

tem o mesmo resultado que a chamada anterior, mas nesse caso, fizemos a chamado subtraction diretamente como um parmetro de cout. Simplesmente imagine que escrevemos:
cout << "O Segundo resultado e " << 5;

pois 5 o resultado de subtraction (7,2).


No caso de cout << "O terceiro resultado e " << subtraction (x,y);

A nica nova coisa que foi introduzida que os parmetros de subtraction so variveis ao invs de constantes. Isso perfeitamente vlido. Nesse caso os valores passados para a funo subtraction so os valores de x e y, que so 5 e 3 respectivamente, dando 2 como resultado.
O quarto caso quase o mesmo. Simplesmente note que ao invs de: z = 4 + subtraction (x,y);

poderamos ter colocado:


z = subtraction (x,y) + 4;

58

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

com exatamente o mesmo resultado. Note que o sinal de ponto-e-vrgula (;) vai ao final de toda a expresso. No vai necessariamente logo aps a chamada da funo. A explicao pode ser mais uma vez que voc imagina que a funo pode ser substituda por seu resultado:
z = 4 + 2; z = 2 + 4;

Funes sem tipos. O uso do void.


Se voc lembra da sintaxe de uma declarao de funo:
tipo nome ( argumento1, argumento2 ...) contedo

voc ver que obrigatrio que a declarao comece com um tipo, que o tipo de dados que ser retornado pela funo com a instruo return. Mas e se no quisermos retornar nenhum valor?
Imagine que queiramos fazer uma funo somente para exibir uma mensagem na tela. Ns no precisamos que retorne nenhum valor, e mais ainda, no precisamos receber nenhum parmetro. Para casos assim, o tipo void foi baseado na linguagem C. D uma olhada: // exemplo de funo void #include <iostream> void dummyfunction (void) { cout << "Eu sou uma funo!"; } int main () { dummyfunction (); return 0; } Embora em C++ no seja necessrio especificar void, seu uso recomendado para significar que uma funo que uma funo sem parmetros ou argumentos e no algo diferente. O que voc sempre precisa saber que o formato da chamada da funo inclui a especificao do nome colocando os argumentos entre parnteses. A no-existncia de argumentos no nos retira a obrigao do uso de parnteses. Por esse motivo, a chamada de dummyfunction : dummyfunction (); Eu sou uma funo!

Isso indica claramente que uma chamada de uma funo e no o nome de uma varivel ou qualquer outra coisa.

59

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Argumentos passados por valor e por referncia.


At agora, em todas as funes que vimos, os parmetros passados para as funes foram passados por valor. Isso significa que ao chamar uma funo com parmetros, o que passamos para as funes foram valores mas nunca as prprias variveis especificadas. Por exemplo, suponha que chamemos nossa primeira funo addition usando o seguinte cdigo :
int x=5, y=3, z; z = addition ( x , y );

O que fizemos nesse caso foi chamar a funo addition passando os valores de x e y, que significam 5 e 3 respectivamente, e no as prprias variveis.

Dessa maneira, quando a funo addition est sendo chamada, o valor de suas variveis a e b tornam-se 5 e 3 respectivamente, mas qualquer modificao de a ou b dentro da funo addition no afetar os valores de x e y fora dela, porque as variveis x e y no foram passadas para a funo, somente seus valores. Mas podem haver alguns caso no qual voc precise manipular de dentro de uma funo o valor de uma varivel externa. Para isso, precisamos usar argumentos passados por referncia, como na funo duplicate do seguinte exemplo: // passagem de parmetros por referncia #include <iostream> void duplicate (int& a, int& b, int& c) { a*=2; b*=2; c*=2; } int main () { int x=1, y=3, z=7; duplicate (x, y, z); cout << "x=" << x << ", y=" << y << ", z=" << z; return 0; } A primeira coisa que deve tomar sua ateno que na declarao de duplicate, o tipo de cada argumento foi seguido por um sinal de E comercial (&), que serve para dizer que a varivel precisa ser passada por referncia ao invs de por valor, como sempre. x=2, y=6, z=14

60

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Ao passar uma varivel por referncia, estamos passando a prpria varivel, e qualquer modificao que fizermos nesse parmetro dentro da funo ir afetar a varivel passada fora dela.

Para expressar isso de outra maneira, ns associamos a, b e c com os parmetros usados na chamada da funo (x, y e z) e qualquer mudana que fizermos em a dentro da funo afetar o valor de x fora dela. Qualquer mudana que fizermos em b afetar y, e o mesmo com c e z. por isso que a sada de nosso programa, que exibe o valor guardado em x, y e z depois da chamada de duplicate, mostra os valores das trs variveis de main duplicadas. Se ao invs de declarar a seguinte funo assim: void duplicate (int& a, int& b, int& c)

tivessemos declarado assim:


void duplicate (int a, int b, int c)

ou seja, sem os sinais de E comercial (&), ns no teramos passado os valores por referncia, mas seus valores, e sendo assim, a sada na tela para nosso programa teria sido os valores de x, y e z sem que tivessem sido modificados. Esse tipo de declarao "por referncia" que usa o sinal de E comercial (&) exclusivo do C++. Na linguagem C teramos que usar ponteiros para fazer algo equivalente.
Passagem por referncia um modo efetivo de permitir que uma funo retorne mais que um nico valor. Por exemplo, aqui est uma funo que retorna os nmeros anteriores e prximos do primeiro parmetro passado. // mais de um valor de retorno #include <iostream> void prevnext (int x, int& prev, int& next) { prev = x-1; next = x+1; } int main () { int x=100, y, z; prevnext (x, y, z); cout << "Anterior=" << y << ", Proximo=" << z; return 0; } Anterior=99, Proximo=101

61

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Valores padro em argumentos. Ao declarar uma funo, precisamos especificar um valor padro para cada parmetro. Esse valor ser usado se o parmetro for deixado em branco na chamada da funo. Para fazer isso, ns simplesmente temos que atribuir um valor aos argumentos na declarao da funo. Se um valor para aquele parmetro no for passado quando a funo for chamada, o valor padro usado, mas se um valor for especifica, esse valor padro ignorado e o valor passado usado. Por exemplo:
// valores padro em funes #include <iostream> int divide (int a, int b=2) { int r; r=a/b; return (r); } int main () { cout << divide (12); cout << endl; cout << divide (20,4); return 0; } Como podemos ver no corpo do programa, h duas chamadas funo divide. Na primeira delas: divide (12) 6 5

somente especificamos um valor, mas a funo divide nos permite especificar dois. Ento a funo divide assumiu que o segundo parmetro 2 pois isso que especificamos para que acontecesse caso esse parmetro estivesse faltando (veja a declarao da funo, que termina com int b=2). Sendo assim, o resultado dessa chamada de funo 6 (12/2).
Na segunda chamada: divide (20,4)

h dois parmetros, ento a atribuio padro (int b=2) substituda pelo parmetro passado, que 4, fazendo com que o resultado seja 5 (20/4).

62

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Funes sobrecarregadas.
Duas funes diferentes podem ter o mesmo nome se o prottipo de seus argumentos for diferente, o que significa que voc pode dar o mesmo nome a mais de uma funo se elas tiverem ou um nmero de argumentos diferentes ou tipos diferentes em seus argumentos. Por exemplo,
// funo sobrecarregada #include <iostream> int divide (int a, int b) { return (a/b); } float divide (float a, float b) { return (a/b); } int main () { int x=5,y=2; float n=5.0,m=2.0; cout << divide (x,y); cout << "\n"; cout << divide (n,m); cout << "\n"; return 0; } Nesse caso, ns definimos duas funes com o mesmo nome, mas uma delas aceita dois argumentos do tipo int e a outra aceita dois do tipo float. O compilador sabe qual delas chamar em cada caso examinando os tipos quando a funo chamada. Se for chamada com dois ints como argumento, chama a funo que tem dois argumentos int no prottipo, e se for chamada com dois floats ia chamar a que possui dois floats em seu prottipo. Por simplicidade, eu inclu o mesmo cdigo em ambas as funes, mas isso no obrigatrio. Voc pode fazer duas funes com o mesmo nome, mas com comportamentos completamente diferentes. 2 2.5

Funes inline.
A diretiva inline pode ser includa antes da declarao de uma funo para dizer que a funo precisa ser compilada como cdigo no mesmo ponto em que for chamada. Isso equivalente a declarar uma macro. Sua vantagem s aparece em funes bem curtas, no qual o cdigo resultante da compilao do programa possa ser mais rpido se o overhead da chamada da funo (empilhamento de argumentos) evitado. 63

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

O formato para essa declarao : inline tipo nome ( argumentos ... ) { instrues ... }

e a chamada igual a chamada de qualquer outra funo. No necessrio incluir a palavrachave inline antes de cada chamada, somente na declarao.

Recursividade
Recursividade a propriedade que funes tem de chamar elas mesmas. til para algumas tarefas como alguns mtodos de procura ou para calcular o fatorial de um nmero. Por exemplo, para obter o fatorial de um nmero (n), sua forma matemtica :
n! = n * (n-1) * (n-2) * (n-3) ... * 1

mais concretamente, 5! (fatorial de 5) :


5! = 5 * 4 * 3 * 2 * 1 = 120

e uma funo recursiva que faz isso poderia ser:


// calculador de fatorial #include <iostream> long factorial (long a) { if (a > 1) return (a * factorial (a-1)); else return (1); } int main () { long l; cout << "Entre com um nmero: "; cin >> l; cout << "!" << l << " = " << factorial (l); return 0; } Note como na funo factorial ns inclumos uma chamada para ela mesma, mas somente se o argumento for maior que 1, pois em caso contrrio, a funo faria um loop recursivo infinito no qual quando chegasse no 0 continuaria multiplicando por todos os nmeros negativos (provavelmente causando um erro de estouro de pilha em execuo). Essa funo tem uma limitao por causa do tipo de dados usado em seu projeto (long) para maior simplicidade. Em um sistema padro, o tipo long no permitiria guardar fatoriais maiores que 12!. Entre com um nmero: 9 !9 = 362880

64

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

Prottipos de funes.
At agora, ns definimos todas as funes antes da primeira aparncia de uma chama a elas, que estava geralmente em main, deixando a funo main para o final. Se voc tentar repetir algum dos exemplos das funes descritas at agora, mas colocando a funo main antes de qualquer outra funo que chamada dentro dela, voc provavelmente obter um erro. A razo disse que para pode chamar um funo, ela precisa ter sido declarada anteriormente (precisa ser conhecida), como fizemos em todos nossos exemplos.
Mas h uma maneira alternativa para evitar escrever todo o cdigo de todas as funes antes que elas possam ser usadas em main ou em outra funo. Isso feito com prottipos de funes. Isso consiste em fazer uma pequena, mas bastante significativa, declarao prvia da definio completa para que o compilado possa saber os argumentos e o tipo de retorno necessrio. Sua forma : tipo nome ( tipo_do_argumento1, tipo_do_argumento2, ...);

idntico ao cabealho de uma definio de funo, exceto por:



No incluir um contedo para a funo. Isso significa que no inclui o corpo com todas as instrues que so geralmente colocadas entre chaves { }. Termina com um sinal de ponto-e-vrgula (;). Na enumerao de argumentos, suficiente colocar o tipo de cada argumento. A incluso de um nome para cada argumento como na definio de uma funo padro opcional, embora seja recomendada.

Por exemplo:
// prottipo #include <iostream> void odd (int a); void even (int a); int main () { int i; do { cout << "Digite para sair)"; cin >> i; odd (i); } while (i!=0); return 0; } Digite um numero (0 para sair): 9 O numero e impar. Digite um numero (0 para sair): 6 O numero e par. Digite um numero (0 para sair): 1030 um numero: (0 O numero e par. Digite um numero (0 para sair): 0 O numero e par.

void odd (int a) { if ((a%2)!=0) cout << "O numero e

65

ALGORITMOS E PROGRAMAO
Professora: GELLARS TAVARES

impar.\n"; else even (a); } void even (int a) { if ((a%2)==0) cout << "O numero e par.\n"; else odd (a); } Esse exemplo no diz respeito a um exemplo de eficincia. Tenho certeza que nesse ponto voc j possa fazer um programa com o mesmo resultado usando apenas metade das linhas de cdigo. Mas esse exemplo ilustra como o prottipo de funes funciona. Mais que isso, nesse caso em particular, o prottipo de pelo menos- uma das duas funes necessrio. As primeiras coisas que vemos so os prottipos das funes odd e even: void odd (int a); void even (int a);

que permitem que essas funes possam ser usadas antes que sejam definidas por completo, por exemplo em main, que agora est localizada em um local mais lgico: no incio do cdigo do programa.
De qualquer maneira, a razo especfica pelo qual esse programa precisa que pelo menos uma das funes tenha prottipo porque em odd h uma chamada para even e em even h uma chamada para odd. Se nenhuma das duas funes tivesse sido declarada previamente, um erro teria acontecido, pois ou odd no seria visvel de even (porque ainda no foi declarada), ou even no seria visvel de odd. Muitos programadores recomendam que todas as funes tenham prottipo. Tambm minha recomendao, principalmente em casos que h muitas funes ou em caso que elas sejam muito compridas. Ter o prottipo de todas as funes no mesmo lugar pode nos ajudar a economizar tempo quando precisamos determinar como cham-las ou at facilitar a criao de um arquivo de cabealho.

66

Vous aimerez peut-être aussi