Вы находитесь на странице: 1из 23

SERVIO PBLICO FEDERAL

MINISTRIO DA EDUCAO CENTRO FEDERAL DE EDUCAO TECNOLGICA DE MINAS GERAIS

Prof. Cristiano Amaral Maffort

Curso Bsico de C++

Av. Amazonas 7675 - Nova Gameleira - Belo Horizonte - MG

Sumrio
Captulo 1: Conceitos bsicos da linguagem C++ .............................................................................3 1.1. C++ Standard Library............................................................................................................3 1.2. Ambiente de desenvolvimento C++ tpico.............................................................................3 1.3. Estrutura bsica de um programa ........................................................................................4 1.4. Armazenamento de dados e programas na memria ..........................................................4 1.5. Bibliotecas ................................................................................................................................5 1.6. Verificao e validao ...........................................................................................................5 Captulo 2: Estruturas seqenciais, entrada/sada de dados.............................................................6 2.1. Variveis ..................................................................................................................................6 2.1.1. Tipos bsicos......................................................................................................................6 2.1.2. Declarao de variveis .....................................................................................................6 2.1.3. Variveis com valores indefinidos.....................................................................................7 2.2. Constantes................................................................................................................................7 2.3. Operadores ..............................................................................................................................8 2.3.1 Operadores Aritmticos ......................................................................................................8 2.3.2. Operadores de atribuio ...................................................................................................8 2.3.3. Operadores relacionais.......................................................................................................8 2.3.4.Operadores lgicos..............................................................................................................9 2.5. Comando de entrada e sada ..................................................................................................9 2.6. Exerccios ...............................................................................................................................10 Captulo 3: Abstrao de controle ....................................................................................................11 3.1. Operador lgico condicional ................................................................................................11 3.2. Operador de seleo..............................................................................................................12 3.3. Operador de repetio ..........................................................................................................12 3.3.1. Repetio com teste no incio ..........................................................................................12 3.3.2. Repetio com varivel de controle no lao ....................................................................12 3.3.3. Repetio com teste no fim..............................................................................................13 3.4. Exerccios ...............................................................................................................................13 Captulo 4: Abstrao de Dados .......................................................................................................15 4.1. Variveis compostas homogneas........................................................................................15 4.1.1. Variveis unidimensionais ...............................................................................................15 4.1.2. Variveis multidimensionais............................................................................................15 4.1.3. Exerccios.........................................................................................................................16 4.2. Variveis compostas heterogneas ......................................................................................16 4.2.1. Registros (Struct) .............................................................................................................16 4.2.2. Registro de conjuntos.......................................................................................................17 4.2.3. Conjunto de registros .......................................................................................................17 ....................................................................................................................................................... 22

Captulo 1: Conceitos bsicos da linguagem C++


A linguagem C++ desenvolveu-se a partir da linguagem C. Foi criada por Bjarne Stroustrup no incio da dcada de 1980 na Bell Laboratories. A linguagem C++ fornece vrios recursos que aprimoram a linguagem C, mas, sobretudo, fornece capacidades para desenvolvimento de software baseados no paradigma de Programao Orientada a Objetos (POO), o qual ser estudado mais adiante.

1.1. C++ Standard Library


Os programas C++ consistem em partes chamadas classes e funes. Um programa em C++ formado a partir da composio dessas partes. A maioria dos programadores em C++ tira proveito das ricas colees de classes e funes existentes na C++ Standard Library. A utilizao dessas bibliotecas pode melhorar o desempenho do programa, porque elas so escritas cuidadosamente para executar com eficincia. Alm disso, elas tanto diminuem o tempo no desenvolvimento de software, atravs de uma prtica chamada reutilizao de software (fundamental para a programao orientada por objetos), como tambm melhoram a portabilidade do programa, ou seja, permite escrever programas que podem ser executados, com pouca ou nenhuma modificao, em uma grande variedade de plataformas e/ou arquiteturas de computadores.

1.2. Ambiente de desenvolvimento C++ tpico


Em geral, os sistemas C++ consistem em trs partes: um ambiente de desenvolvimento, a linguagem e a C++ Standard Library. Os programas C++, em geral, passam pelas seguintes fases:

Fase 1: Criando um Programa Consiste em editar um arquivo com um programa editor onde vc realiza quaisquer alteraes no cdigofonte e o salva em um dispositivo de armazenamento secundrio. Neste curso utilizaremos a IDE DevC++ (disponvel em www.bloodshed.net/devcpp.html) para realizao desta e de outras etapas a seguir.

Fase 2: Pr-processamento O pr-processador C++ obedece a comandos chamados de diretivas de pr-processador, que indicam que certas manipulaes devem ser realizadas no programa antes da compilao. Essas manipulaes incluem outros arquivos de texto a serem compilados e realizam vrias substituies de texto. Fase 3: Compilao Quando o programador executa o comando para compilar o programa, o pr-processador automaticamente chamado. Aps o pr-processamento, o compilador converte o programa C++ em cdigo de linguagem de mquina (tambm referido como cdigo-objeto). Fase 4: Linkagem Em geral, os programas C++ contm referncias a funes e dados definidos em outra parte, como nas bibliotecas padro. Normalmente, o cdigo-objeto produzido pelo compilador C++ contm lacunas devido a essas partes ausentes. Um linker vincula o cdigo-objeto com o cdigo das funes ausentes para produzir uma imagem executvel. Fase 5: Carregamento Antes de um programa ser executado, ele deve ser previamente colocado na memria principal. Isso feito pelo carregador, que pega a imagem executvel do disco e a transfere para a memria. Componentes adicionais de bibliotecas compartilhadas que suportam o programa tambm so carregados. Fase 6: Execuo Por fim, o computador, sob o controle da CPU, executa o programa.

1.3. Estrutura bsica de um programa


Exemplo padro utilizado como introduo maioria das linguagens de programao. O programa exibe o texto Ol Mundo! no monitor. 1. 2. 3. 4. 5. 6. 7. #include <iostream> // permite que o programa gere sada de dados na tela int main() // a funo main inicia a execuo do programa { std::cout << "Al mundo!!!"; // exibe a mensagem return 0; // indica que o programa terminou com sucesso } // fim da funo main

A primeira linha do programa uma directiva de pr-processamento #include, que diz ao compilador para substituir aquela linha pela totalidade do contedo do ficheiro a que a directiva se refere (neste caso iostream). Assim, o ficheiro padro iostream (que contm os prottipos de funes para operaes de entrada e sada) ir substituir a linha. A linha 3 declara uma funo, obrigatria para qualquer programa em C++, denominada main. A funo main tem um significado especial no algoritmo em C++, pois a funo chamada no incio do fluxo de execuo do programa, assim que ele comea. Os caracteres { } (linhas 4 e 7) delimitam, neste caso, a extenso da funo. O termo int define que a funo main retorna um nmero inteiro. O trecho de cdigo da linha 5 responsvel por executar uma funo de sade de dados para a tela, chamada cout, a qual responsvel por imprimir a mensagem Al mundo!!!. O comando return (linha 6) responsvel por interromper o fluxo de execuo da funo e retornar um resultado, do mesmo tipo definido no corpo da funo, para o mtodo que invocou essa funo. A linguagem C++ no impe o uso de uma formatao rgida. Nela, o programador escolhe a forma mais apropriada para escrever seu cdigo. Podemos, por exemplo, escrever vrios comandos em uma nica linha ou dividir um mesmo comando em diversas linhas. No entanto, para que nossos cdigos tenham clareza, na maioria das vezes, optamos por escrever cada comando em um linha, sempre que possvel. Pode-se tambm inserir comentrios no cdigo-fonte, iniciados com //, conforme ilustrado anteriormente. Comentrios de mltiplas linhas devem ser inicializados com /* e finalizados com */. Devemos notar tambm que comandos e declaraes em C++ so terminados pelo caractere ponto-evrgula (;)

1.4. Armazenamento de dados e programas na memria


A memria do computador dividida em unidades de armazenamento chamadas bytes. Cada posio de memria tem um endereo nico. Como veremos nas prximas sees, quando reservamos um espao de memria para armazenar um determinado valor, esse espao finito, composto de 1 ou mais bytes. Portanto, a faixa de valores e a

peciso com que representamos um valor no computador so finitas, pois temos um nmero finito de bits 8 para essa representao. Assim, em um espao de 1 byte (8 bits), s podemos representar 2 (=256) valores distintos. Se s podemos armazenar nmeros na memria do computador, como fazemos para armazenar um texto (um documento ou uma mensagem)? Para armazenar uma seqncia de caracteres, que representa o texto, atribui-se a cada caractere um cdigo numrico (por exemplo, pode-se associar ao caractere A o cdigo 65, ao caractere B o cdigo 66, e da por diante). Se todos os caracteres tiverem cdigo associados (inclusive os caracteres de pontuao e de formatao), podemos armazenar um texto na memria do computador como uma seqncia de cdigos numricos. A mesma estratgia usada para representar um programa na memria do computador. Um computador s pode executar programas em linguagens de mquina. Cada programa executvel uma seqncia de instrues que a CPU interpreta, executando as operaes correspondentes. Essa seqncia de instrues tambm representada como uma seqncia de cdigos numricos. Os programas ficam armazenados em disco e, para serem executados pelo computador, devem ser carregados (transferidos) para a memria principal. Uma vez na memria, o computador executa a seqncia de operaes correspondentes.

1.5. Bibliotecas
A tarefa das bibliotecas permitir que funes de interesse geral estejam disponveis com facilidade. Nosso exemplo usa a biblioteca de entrada/sada padro de C++, iostream, que oferece funes para permitir a captura de dados a partir do teclado e a sada de dados para a tela, entre outras. Alm de bibliotecas preparadas pelo fornecedor do compilador ou por outros fornecedores de software, podemos ter bibliotecas preparadas por um programador qualquer, que pode empacotar classes e funes com utilidades relacionadas em uma biblioteca e, dessa maneira, facilitar seu uso em outros programas.

1.6. Verificao e validao


Programas, via de regra, podem conter erros, que precisam ser identificados e corrigidos. Quase sempre a verificao realizada por meio de testes, que executam o programa a ser testado com diferentes valores de entrada. Identificado um ou mais erros, o cdigo-fonte corrigido e deve ser novamente verificado. O processo de edio, compilao, ligao e teste repetido at que os resultados sejam satisfatrios, e o programa seja considerado validado. O ciclo de desenvolvimento de um programa pode ser facilitado pela utilizao de um ambiente integrado de desenvolvimento (Integrated Development Environment). O IDE um programa que oferece interfaces para a edio, compilao e depurao de programas. Se um IDE estiver disponvel, possvel criar e testar um programa, tudo em um mesmo ambiente, e todo o ciclo mencionado acontece de maneira mais confortvel dentro de um mesmo ambiente, de preferncia com uma interface amigvel.

Captulo 2: Estruturas seqenciais, entrada/sada de dados


Nesta seo sero apresentadas as principais operaes e comandos da linguagem C++ indispensveis implementao de programas.

2.1. Variveis
Podemos dizer que uma varivel representa um espao na memria do computador para armazenar um determinado tipo de dado. Na linguagem C++, todas as variveis devem ser explicitamente declaradas. Na declarao de uma varivel, devem ser especificados seu tipo e nome: o nome da varivel serve de referncia ao dado armazenado no espao de memria da varivel e o tipo da varivel determina a natureza do dado que ser armazenado. S podemos armazenar valores do tipo especificado na declarao da varivel. Assim, se declaramos uma varivel como sendo do tipo inteiro, s podemos armazenar valores inteiros no espao de memria correspondente. 2.1.1. Tipos bsicos A linguagem C++ oferece alguns tipos bsicos. Esses tipos diferem entre si pelo espao de memria que ocupam e, conseqentemente, pelo intervalo de valores que podem representar. O tipo char, 8 por exemplo, ocupa 1 byte de memria (8 bits), e pode representar 2 (=256) valores distintos. A Tabela 1 ilustra os principais tipos bsicos da linguagem C++. Tipo char unsigned char short int unsigned short int long int unsigned long int long long int unsigned long long int float double long double Tamanho (bytes) 1 1 2 2 4 4 8 8 4 8 16 Representatividade -128 a 127 0 a 255 -32.768 a 32.767 0 a 65.535 -2.147.483.648 a 2.147.483.647 0 a 4.294.967.295 -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 0 a 18.446.744.073.709.551.615 10 10
-38

a 10

38 308 4932

10

-308

a 10

-4932

a 10

Tabela 1: Tipos bsicos e suas representatividades Um outro importante tipo da linguagem C++ o tipo int puro, o qual , em geral, mapeado para o tipo inteiro natural da mquina. Nas maioria das mquinas usadas hoje, que funcionam com processadores de 32 bits (4 bytes), o tipo int mapeado para o inteiro de 4 bytes (long int). Alguns desses tipos podem ainda ser modificados para representar apenas valores positivos, o que pode ser feito precedendo o tipo com o modificador unsigned (sem sinal). O tipo char freqentemente usado para representar cdigos de caracteres, como veremos nas sees subseqentes. A linguagem oferece ainda dois tipos bsicos para a representao de nmeros reais: float e double. O tipo double recomendado para as situaes nas quais a preciso numrica das operaes de fundamental importncia. Por exemplo, em aplicaes que fazem simulaes numricas, em geral precisamos trabalhar com maior preciso. 2.1.2. Declarao de variveis Para armazenar um dado (valor) na memria do computador, devemos reservar o espao correspondente ao tipo do dado. A declarao de uma varivel reserva um espao de memria para armazenar um dado do tipo da varivel e associa o nome da varivel a esse espao de memria. No fragmento de cdigo a abaixo, so declaradas trs variveis, duas (a e b) para armazenar valores inteiros (tipo int) e uma (c) para armazenar valores reais (tipo float). Uma vez declaradas as variveis, podemos armazenar valores dos tipos correspondentes. Isso feito atribuindo-se valores s variveis. No possvel, por exemplo, armazenar um nmero real numa varivel do tipo int.

int a; int b; float c;

/* declara uma varivel do tipo int */ /* declara outra varivel do tipo int */ /* declara uma varivel do tipo float */

a = 5; /* armazena o valor 5 em a */ b = 10; /* armazena o valor 10 em b */ c = 5.3; /* armazena o valor 5.3 em c */ A linguagem permite que variveis de mesmo tipo sejam declaradas juntas. Assim, essas duas primeiras declaraes poderiam ser substitudas por: int a, b; /* declara duas variveis do tipo int */ A linguagem permite que as variveis sejam inicializadas na declarao. Podemos, por exemplo, escrever: int a = 5, b = 10; float c = 5.3; /* declara uma varivel do tipo int */ /* declara outra varivel do tipo float */

2.1.3. Variveis com valores indefinidos Um dos erros comuns em programas de computador o uso de variveis cujos valores ainda esto indefinidos. Se declaramos uma varivel sem explicitamente inicializar seu valor, ele indefinido. Existe um valor armazenado, representado pela seqncia de bits do espao reservado, mas, como no temos controle sobre esse valor, no faz sentido utiliz-lo. Costumamos dizer que o valor da varivel lixo. Por exemplo, o trecho de cdigo a seguir est errado, pois o valor armazenado na varivel b est indefinido e tentamos us-lo na atribuio a c. int a, b, c; a = 5; c = a + b;

/* ERRO: b tem lixo */

Alguns desses erros so bvios (como o ilustrado), e o compilador capaz de nos reportar uma advertncia. No entanto, muitas vezes o uso de uma varivel no definida difcil de ser identificado no cdigo. importante ressaltar que esse um erro comum em programas, e uma razo para alguns programas funcionarem na parte da manh e no funcionarem na parte da tarde (ou funcionarem durante o desenvolvimento e no funcionarem quando os entregamos ao cliente). Todos os erros em computao tem lgica. A razo de o programa funcionar uma vez e no funcionar outra que, como j mencionamos, apesar de indefinido, o valor da varivel existe. No nosso caso citado anteriormente, pode acontecer de o valor armazenado na memria ocupada por b ser 0, fazendo com que o programa funcione. Por outro lado, pode acontecer de o valor ser, por exemplo, -29345 e o programa no funcionar conforme esperado.

2.2. Constantes
Tem-se como definio de constante tudo aquilo que e fixo ou estvel, e existiro vrios momentos em que este conceito dever estar em uso. Em nossos cdigos, usamos tambm valores constantes. Quando escrevemos a atribuio: a = b + 123; sendo a e b variveis supostamente j decladas, deve-se representar internamente tambm a constante 123, para que a operao possa ser avaliada em tempo de execuo. As constantes tambm podem ser do tipo real. Uma constante real deve ser escrita com um ponto decimal ou valor de expoente. Sem nenhum sufixo, uma constante real do tipo double. Se quisermos uma constane real do tipo float, devemos acrescentar o sufixo F ou f. Alguns exemplos de constantes reais so: 12.45 1245e-2 12.45F /* constante real do tipo double */ /* constante real do tipo double */ /* constante real do tipo float */

Alguns compiladores exibem uma advertncia quando encontram este cdigo: float x = 12.45; pois o cdigo, a rigor, armazena um valor double (12.45) em uma varivel do tipo float. Desde que a constante seja representvel dentro de um float, no precisamos nos preocupar com esse tipo de advertncia. Todavia, se quisermos evit-lo, podemos representar a constante em preciso de float: float x = 12.45f;

2.3. Operadores
Tanto variveis como constantes podem ser utilizadas na elaborao de clculos matemticos com a utilizao de operadores aritmticos. Os operadores aritmticos so classificados em duas categorias, sendo binrios ou unrios. A Tabela 2 apresenta um resumo dos operadores aritmticos utilizados na linguagem C++. Operador + % / * + pow(base, expoente) sqrt(valor numrico) Operao Manuteno de sinal Inverso de sinal Resto de diviso Diviso Multiplicao Adio Subtrao Exponenciao Raiz quadrada Tipo Unrio Unrio Binrio Binrio Binrio Binrio Binrio Binrio Unrio Resultado Inteiro Inteiro ou Real Inteiro ou Real Inteiro ou Real Inteiro ou Real Real Real

Tabela 2: Principais operadores aritmticos da linguagem C++ Para utilizar as funes pow() e sqrt(), necessrio que a biblioteca cmath seja inicialmente includa no programa com o comando #include antes da funo principal main(), utilizando a sintaxe: #include <cmath>. 2.3.1 Operadores Aritmticos As operaes aritmticas so realizadas na preciso dos operandos. Assim, a expresso 5/2.5, o valor do operando de menor expressividade (no caso, int) implicitamente convertido para o tipo de maior expressividade (double), e a operao feita na preciso double. O operador mdulo (%) no se aplica a valores reais e seus operandos devem ser do tipo inteiro. Esse operador produz o resto da diviso do primeiro operador pelo segundo. Os operadores *, / e % tm precedncia maior do que os operadores + e -. O operador unrio -- tem precedncia maior do que *, / e %. Operadores com a mesma precedncia so avaliados da esquerda para a direita. Quando desejamos controlar a ordem na avaliao das operaes podemos utilizar os parnteses. 2.3.2. Operadores de atribuio A atribuio uma expresso cujo valor resultante correspondente ao valor atribudo. A expresso a = 5 + 2 resulta no valor 7, alm, claro de armazenar o valor 7 na varivel a. A avaliao das operaes de atribuio so realizadas da direita para a esquerda. Assim, na avaliao da expresso y = x = 5, o computador ir avaliar x = 5, armazenando 5 em x, e em seguida, armazena em y o valor produzido por x = 5, que 5. 2.3.3. Operadores relacionais Os operadores relacionais so usados para comparar dois valores. A Tabela 3 apresentada os operadores relacionais da linguagem C++.

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

Tabela 3: Operadores relacionais da linguagem C++

Esses operadores comparam dois valores. O resultado produzido por um operador relacional zero ou um. O valor zero interpretado como falso, e qualquer valor diferente de zero considerado verdadeiro. 2.3.4.Operadores lgicos Os operadores lgicos servem para combinar expresses booleanas. A Tabela 4 apresenta os operadores lgicos da linguagem C++.

Smbolo Significado
&& || Operador binrio E (AND) Operador binrio OU (OR) Operador binrio OU EXCLUSIVO (XOR) ^ ! Operador unrio de NEGAO (NOT)

Tabela 4: Operadores lgicos da linguagem C++

Expresses conectadas por && ou || so avaliadas da esquerda para direita, e a avaliao pra assim que a veracidade ou falsidade de resultado for conhecida.

2.5. Comando de entrada e sada


Nesta Seo abordaremos apenas aquilo que essencial para implementao dos exerccios presentes nesta apostila. Quando se tornar necessrio, um detalhamento mais aprofundado ser apresentado. A entrada e sada padro de C++ so implementadas na biblioteca iostream. Os objetos de fluxopadro so: cin, cout, cerr e clog, os quais so abertos automaticamente pelo sistemas quando da incluso desta biblioteca. cin: corresponde entrada padro cout: corresponde sada padro cerr: corresponde sada padro de erros, sem bufferizao clog: corresponde sada padro de erros, com bufferizao

O operador << (operador de deslocamento para a esquerda) permite inserir valores em um fluxo de sada. J o operador >> (operador de deslocamento para a direita) permite extrair valores de um fluxo de entrada. Exemplo 2.1: Elaborar um programa que efetue a apresentao do valor da converso em dlar (US$) de um valor lido em real (R$). O programa dever solicitar o valor da cotao do dlar e tambm a quantidade de reais disponvel com o usurio. #include <iostream> int main() {

float cotacaoDolar, // valor da cotao do dolar qteReais, // quantidade de reais disponvel qteDolares; // quantidade de dolares std::cout << "Informe a cotacao do dolar: "; std::cin >> cotacaoDolar; std::cout << "Informe a quantidade de reais: "; std::cin >> qteReais; qteDolares = qteReais/cotacaoDolar; std::cout << "Total de dolares: " << qteDolares << std::endl; return 0; }

O operador << pode ser usado, de forma encadeada, para inserir diversos valores em um mesmo fluxo de sada.

2.6. Exerccios
1) Elaborar um programa que efetue a leitura de trs valores inteiros (representados pelas variveis, A, B e C) e apresente como resultado a soma, a mdia e o produto dessas trs variveis. 2) Ler uma temperatura em graus Celsius e apresent-la convertida em graus Fahrenheit. A frmula de converso : F (9* C+160)/5, sendo F a temperatura em Fahrenheit e C a temperatura em Celsius. 3) Ler dois valores para as variveis A e B, efetuar a troca dos valores de forma que a varivel A passe a possuir o valor da varivel B e a varivel B passe a possuir o valor da varivel A. Apresentar os valores trocados. 4) Elaborar um programa que efetue a apresentao do valor da converso em real (R$) de um valor lido em dlar (US$). O programa dever solicitar o valor da cotao do dlar e tambm a quantidade de dlares disponvel com o usurio. 5) Efetuar o clculo de quantidade de litros de combustvel gastos em uma viagem, utilizando-se um automvel que faz 12 Km por litro. Para obter o clculo, o usurio dever fornecer o tempo gasto e a velocidade mdia durante viagem. Desta forma, ser possvel obter a distncia percorrida com a frmula DISTNCIA TEMPO * VELOCIDADE. Tendo o valor da distncia, basta calcular a quantidade de litros de combustvel utilizada na viagem com a frmula: LITROS_USADOS DISTNCIA/12. O programa dever apresentar os valores da velocidade mdia, o tempo gasto na viagem, a distncia percorrida e a quantidade de combustvel gasto. 6) Em uma eleio sindical concorreram ao cargo de presidente trs candidatos (A, B, C). Durante a apurao dos votos foram computados votos nulos e votos em branco, alm dos votos vlidos para cada candidato. Deve ser criado um programa de computador que efetue a leitura da quantidade de votos vlidos para cada candidato, alm de efetuar tambm a leitura de votos nulos e votos em branco. Ao final o programa deve apresentar o nmero total de eleitores, considerando votos vlidos, votos nulos e em branco; o percentual correspondente de votos vlidos em relao quantidade de eleitores; o percentual correspondente de votos vlidos do candidato A relao quantidade de eleitores; o percentual correspondente de votos vlidos do candidato B em relao quantidade de eleitores; o percentual correspondente de votos vlidos do candidato C em relao quantidade de eleitores; o percentual correspondente de votos nulos em relao em relao quantidade de eleitores; e por ltimo o percentual correspondente de votos em branco em relao quantidade de eleitores.

Captulo 3: Abstrao de controle


Na seo anterior os programas eram formados apenas por seqncias simples de comandos. Para construo de programas mais elaborados, precisamos ter acesso a mecanismos que permitam controlar o fluxo de execuo dos comandos. Por exemplo, fundamental ter meios para tomar decises que se baseiem em condies avaliadas em tempo de execuo. Tambm precisamos de mecanismos para a construo de procedimentos iterativos, isto , procedimentos que repetem a execuo de uma seqncia de comandos um determinado nmero de vezes. Nesta Seo, discutiremos os principais mecanismos para abstrao de controle oferecidos pela linguagem C++. Ela prov as construes fundamentais de controle de fluxo necessrias para programas bem estruturados: agrupamento de comandos, tomadas de deciso (operadores lgicos condicionais), seleo de um caso entre um conjunto de casos possveis (operador de seleo) e laos de repetio com teste de encerramento no incio, no fim, e com variavl de controle.

3.1. Operador lgico condicional


O comando if o comando bsico para codificar tomada de deciso em C++. Sua sintaxe bsica ilustrada abaixo. a) if (expr) { comando 1; comando 2; ... comando n; } b) if (expr) { bloco de comandos 1; } else { bloco de comandos 2; }

Em b, se a avaliao de expr resultar em um valor diferente de 0 (isto , se o valor for verdadeiro), o bloco de comandos 1 ser executado. A incluso do else requisita a execuo do bloco de comandos 2 se a expresso resultar no valor 0 (falso). Cada bloco de comandos deve ser delimitado por uma chave aberta e uma fechada. No entanto, se dentro de um bloco tivermos apenas um nico comando a ser executado, as chaves podem ser omitidas (a rigor, deixamos de ter um bloco). Em C++, um else associado ao ltimo if que no tiver seu prprio else. Para os casos em que a associao entre if e else no est clara, recomendo a criao explcita de blocos, mesmo contendo um nico comando. No trecho de cdigo ilustrado abaixo, o resultado para o valor 5 seria a mensagem Temperatura muito quente. Isto , o programa est incorreto. #include <iostream> int main() { int temp; std::cout << "Digite a temperatura: "; std::cin >> temp; if (temp < 30) if (temp > 20) std::cout << "Temperatura agradavel.\n"; else std::cout << "Temperatura muito quente.\n"; return 0; } Se reescrevermos o programa, podemos obter o efeito desejado. #include <iostream> int main() { int temp; std::cout << "Digite a temperatura: "; std::cin >> temp; if (temp < 30) { if (temp > 20) std::cout << "Temperatura agradavel.\n"; } else std::cout << "Temperatura muito quente.\n"; return 0; }

3.2. Operador de seleo


Alm da construo if-else, C++ prov um comando (switch) para selecionar um entre um conjunto de casos possveis. Sua forma geral : switch (expr) { case op1: /* comandos executados se expr == op1 */ ... break; case op2: ... /* comandos executados se expr == op2 */ break; ... case opN: ... /* comandos executados se expr == opN */ break; default: ... /* executados se expr for diferente de todos */ break; } opi deve ser um nmero inteiro ou um caractere. Se expr resultar no valor opi, os comandos seguintes ao caso opi so executados at encontrar um break. Se o comando break for omitido, a execuo do caso continua com os comandos do caso seguinte. Se o valor de expr for diferente de todos os casos enumerados, o bloco de comandos associado a default executado. O bloco default normalmente colocado por ltimo e no obrigatrio.

3.3. Operador de repetio


Em programas computacionais, procedimentos iterativos so muito comuns, isto , procedimentos que devem ser executados em vrios passos. Como exemplo, vamos considerar o clculo do valor do fatorial de um nmero inteiro no negativo. n! = n * (n-1) * (n-2) * ... * 2 * 1 | n >= 0, f(0) = 1 Para calcular o fatorial de um nmero com um programa de computador, normalmente utilizamos um processo iterativo, em que o valor da varivel varia de 1 a n, avaliando o produtrio dos valores nesse intervalo. A linguagem C++ oferece diversas construes possveis para a realizao de laos iterativos. 3.3.1. Repetio com teste no incio Na linguagem C++, o operador de repetio com teste de parada no incio o comando while. Sua forma geral : while (expr_de_parada) { bloco de comandos } Se a avaliao da expresso de parada (expr_de_parada) resultar em verdadeiro, o bloco de comando executado. Ao final do bloco, a expresso volta a ser avaliada e, enquanto a expresso de parada resultar em verdadeiro, o bloco de comandos executado repetidamente. Quando a expresso de parada for avaliada em falso, o bloco de comandos deixa de ser executado, e a execuo do programa prossegue com a execuo dos comandos subseqentes ao bloco. 3.3.2. Repetio com varivel de controle no lao Uma segunda forma de construo de laos em C++, mais compacta e amplamente utilizada, o operador de repetio for. Sua forma geral : for (expr_inicial; expr_de_parada; expr_de_incremento) { bloco de comandos }

A construo com for equivalente ao uso do while, com a ordem de avaliao das expresses ilustradas a seguir: expr_inicial; while (expr_de_parada) { bloco de comandos ... expr_de_incremento; } Isto , a expresso inicial avaliada uma nica vez antes da execuo do lao. Em seguida, a expresso de parada, que controla a execuo do lao, avaliada e, enquanto for verdadeira, o bloco de comandos executado. Imediatamente aps cada execuo do bloco de comandos, a expresso de incremento avaliada, o lao se completa e a expresso de parada volta a ser avaliada. 3.3.3. Repetio com teste no fim Tanto a construo com while como a construo com for avaliam a expresso de parada, que caracteriza o teste de encerramento, no nicio do lao. Assim, se essa expresso for falsa, quando for avaliada pela primeira vez, os comandos do corpo do bloco no sero executados nem uma vez. A linguagem C++ prov um outro operador de repetio para a construo de laos cujo teste de encerramento avaliado no final. Esse operador o do-while, cuja forma geral : do{ bloco de comandos } while (expr_de_parada);

3.4. Exerccios
1. Ler trs valores para os lados de um tringulo, considerando lado como: A, B e C. Verificar se os lados fornecidos formam realmente um tringulo, e se for esta condio verdadeira, dever se indicado qual tipo de tringulo foi formado: issceles, escaleno ou eqiltero. Construa uma calculadora convencional que efetua as quatro operaes bsicas (+, -, *, /). Faa uma verso desse programa usando comando de deciso e uma verso usando comando de seleo. Efetuar a leitura de trs valores (variveis A, B e C) e efetuar o clculo da equao de segundo grau, apresentando as duas razes, se para os valores informados for possvel efetuar o referido clculo. Efetuar a leitura de trs nmeros inteiros e identificar o maior e o menor valor. Efetuar a leitura de trs valores (variveis A, B e C) e apresentar os valores dispostos em ordem crescente. Elabore um programa que leia um valor numrico positivo ou negativo e apresentar o valor lido como sendo um valor positivo. Faa um programa que leia o ano de nascimento de uma pessoa, calcule e mostre sua idade e, tambm, verifique e mostre se ela j tem idade para votar (16 anos ou mais) e para conseguir a Carteira de Habilitao (18 anos ou mais). Elabore um programa que calcule o que deve ser pago por um produto, considerando o preo normal de etiqueta e a escolha da condio de pagamento. Utilize os cdigos da tabela a seguir para ler qual a condio de pagamento escolhida e efetuar o clculo adequado. Cdigo 1. 2. 3. 4. 9. Condio de pagamento vista em dinheiro ou cheque, recebe 10% de desconto vista no carto de crdito, recebe 5% de desconto Em duas vezes, preo normal da etiqueta sem juros Em trs vezes, preo normal de etiqueta mais juros de 10%

2. 3. 4. 5. 6. 7.

8.

Elabore um programa que leia 2 valores numricos inteiros e apresente o resultado da diferena do maior valor pelo menor valor.

10. Imagine uma brincadeira entre dois colegas, na qual um pensa um nmero e o outro deve fazer chutes at acertar o nmero imaginado. Como dica, a cada tentativa dito se o chute foi alto ou baixo. Elabore

um algoritmo dentro deste contexto, que leia o nmero imaginado e os chutes, ao final mostre quantas tentativas foram necessrias para descobrir o nmero. 11. Construa um programa que permita fazer um levantamento do estoque de vinhos de uma adega, tendo como dados de entrada tipos de vinho, sendo: T para tinto, B para branco e R para ros. Apresente a porcentagem de cada tipo sobre o total geral de vinhos; a quantidade de vinhos desconhecida. 12. Faa um programa que efetue a soma de todos os nmeros mpares que so mltiplos de 3 e que se encontram no conjunto dos nmeros de 1 at 500. 13. Prepare um programa capaz de inverter um nmero qualquer fornecido pelo usurio. Ou seja, se o nmero informado pelo usurio for 123456789, o programa deve exibir o nmero 987654321. 14. Construa um programa que seja capaz de dar a classificao olmpica de 3 pases informados. Para cada pas informado o nome, a quantidade de medalhas de ouro, prata e bronze. Considere que cada medalha de ouro tem peso 3, cada prata tem peso 2 e cada bronze, peso 1. 15. Elabore um programa que obtenha o mnimo mltiplo comum (MMC) entre dois nmeros fornecidos. 16. Construa um programa que gere os 20 termos sucessores da srie de Fibonacci a partir de 2 primeiros termos fornecidos pelo usurio. 17. Construa um programa que leia um conjunto de dados contento altura e sexo (M para masculino e F para feminino) de 50 pessoas, e depois, calcule e escreva: A maior e a menor altura do grupo; A mdia de altura das mulheres; O nmero de homens; A diferena percentual entre os homens e as mulheres; 18. Anacleto tem 1,50 metros e cresce 2 centmetros por ano, enquanto Felisberto tem 1,10 metros e cresce 3 centmetros por ano. Construa um algoritmo que calcule e imprima quantos anos sero necessrios para que Felisberto seja maior que Anacleto. 19. Apresentar o total da soma dos cem primeiros nmeros inteiros: (1+2+3+4+5+6+7+...+97+98+99+100). 20. Fazer um programa que, a partir de um nmero de CPF informado pelo usurio, verifique se o nmero informado vlido ou no.

Captulo 4: Abstrao de Dados


Apesar da grande quantidade de tipos de dados primitivos vistos na Seo 2.1.1., os quais representam apenas alguns dos principais tipos primitivos da linguagem C++, em muitos casos esses tipos no so suficientes para representar toda e qualquer informao que possa surgir. Portanto, em muitas situaes esses recursos de representaes so escassos, o que poderia ser suprido se existissem mais tipos de dados ou, ainda melhor, se esses tipos pudessem ser criados medida que se fizessem necessrios.

4.1. Variveis compostas homogneas


Uma varivel pode ser interpretada como um elemento, e uma estrutura de dados como um conjunto. Quando uma determinada estrutura de dados composta de variveis com o mesmo tipo primitivo, temos um conjunto homogneo de dados. Podemos considerar que uma varivel composta homognea seja como uma alcatia, e seus elementos (variveis) sejam como lobos (que so da mesma espcie). 4.1.1. Variveis unidimensionais Uma matriz de uma dimenso, comumente chamada de vetor, representada por seu nome, tamanho (dimenso) e seu tipo, tendo a seguinte sintaxe: tipo NOME[dimenso]; Onde: tipo: ............. o tipo de dado a ser armazenado no vetor; NOME: ........ o nome atribudo ao vetor, o qual ser utilizado para manipular os valores nele contidos; dimenso: ...Refere-se ao tamanho do vetor, ou seja, capacidade de armazenamento de dados no vetor, em nmero de elementos. Assim, a declarao int v[10]; cria um vetor de inteiros dimensionado com 10 elementos, isto , reserva-se um espao de memria contnuo para armazenar 10 valores inteiros. Desta forma, se cada int ocupa 4 bytes, a declarao reserva um espao de memria de 40 bytes. Alm disso, o acesso a cada elemento do vetor feito por meio de uma indexao da varivel v. No entanto, deve-se atentar para o fato de que a indexao de um vetor em C++ realizada apenas por nmeros inteiros positivos. Ou seja, suponha um vetor v de tamanho N, nesse caso os ndices de v variam no intervalo de 0 a N-1. Assim, para a declarao do vetor v de 10 posies ilustrado anteriormente, a entrada v[10] resultaria na indexao de uma posio invlida do vetor, e conseqentemente numa invazo de memria. importante no confundir o ndice com o elemento. ndice o endereo de alocao de uma unidade do vetor, enquanto elemento o contedo armazenado em um determinado endereo. Vetores tambm podem ser inicializados na declarao: int v[] = {1, 2, 3, 4, 5}; Observe que o compilador dimensiona o vetor de acordo com o nmero de elementos especificados na inicializao. 4.1.2. Variveis multidimensionais A linguagem C++ permite a criao de vetores bidimensionais, declarados estaticamente. Esse tipo de vetor comumente chamado de matriz e relaciona-se diretamente com problemas que envolvam estruturas de dados homogneas, mas que podem ser organizadas em forma de tabela. Uma matriz declarada de forma semelhante a um vetor, sendo representada pelo seu nome, tamanho (agora definidos atravs de duas dimenses) e seu tipo, tendo a seguinte sintaxe: tipo NOME[dimenso_1][dimenso_2]; Onde: tipo: ............... o tipo de dado a ser armazenado na matriz; NOME: .......... o nome atribudo matriz, o qual ser utilizado para manipular os valores nela contidos; dimenso_1: . Refere-se ao tamanho da matriz em nmero de linhas. dimenso_2: . Refere-se ao tamanho da matriz em nmero de colunas. Podemos declarar uma matriz de valores reais com 4 linhas e 3 colunas da seguinte forma: float m[4][3];

Essa declarao reserva um espao de memria necessrio para armazenar os 12 elementos da matriz, que so armazenados de maneira contnua, organizados linha a linha. Os elementos da matriz so acessados com indexao dupla: mat[l][c]. O primeiro ndice, l, acessa a linha, e o segundo, c, acessa a coluna. Da mesma forma que os vetores, as matrizes tambm podem ser inicializadas na declarao: int matriz[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}}; Ou ainda podemos inicializar seqencialmente: int matriz[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; O nmero de elementos por linha pode ser omitido numa inicializao, mas o nmero de colunas deve ser sempre fornecido: int matriz[][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; 4.1.3. Exerccios 1. Ler 8 elementos em um vetor A. Construir um vetor B da mesma dimenso contendo os elementos do vetor A multiplicados por 5. 2. Ler um vetor com 15 elementos. Construir um vetor B de mesmo tipo, sendo que cada elemento do vetor B seja o fatorial do elemento correspondente do vetor A. 3. Ler 20 elementos em uma matriz qualquer, considerando que ela tenha o tamanho de 4 linhas por 5 colunas, em seguida apresentar a matriz. 4. Ler duas matrizes A e B, cada uma de duas dimenses com 5 linhas e 3 colunas. Construir uma matriz C de mesma dimenso, que seja formada pela soma dos elementos da matriz A com os elementos da matriz B. Apresentar os elementos da matriz C. 5. Num frigorfico existem 90 bois. Cada boi traz, preso em seu pescoo, um carto contendo o seu nmero de identificao (inteiro) e seu peso (real). Fazer um algoritmo que: imprima os nmeros e respectivos pesos dos bois mais gordos e dos bois mais magros. imprima os nmeros e respectivos pesos dos dois bois mais gordos e dos dois bois mais magros. 6. Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para isso, montou uma ficha (uma para cada mercadoria) com o nome, o preo de compra e o preo de venda das mesmas. Fazer um programa que: Determine e escreva quantas mercadorias proporcionam: lucro < 10% 10% <= lucro <= 20% lucro > 20% Determine e escreva o valor total de compra e de venda de todas as mercadorias, assim como o lucro total.

4.2. Variveis compostas heterogneas


Nas sees anteriores foram apresentadas tcnicas de programao que envolveram o uso de tipos primitivos e de estruturas de dados homogneas. Nesses casos, somente foi possvel trabalhar com um tipo de dado nas variveis compostas (vetores e matrizes). Essa restrio induz a utilizao de mltiplas matrizes para alocar valores de diferentes tipos. Alm disso, conduz o programador a adotar tcnicas de programao que dificultam a legibilidade do cdigo. 4.2.1. Registros (Struct) Registros so estruturas de dados que encapsulam mltiplos dados de tipos diferentes em um novo tipo de dado. Por esta razo, este tipo de dado considerado heterogneo. No exerccio 5 da seo anterior era solicitado, para cada boi, o cadastro do seu identificador (expresso como um nmero inteiro) e do seu respectivo peso (expresso como um nmero real). Essa diversidade de tipos obrigou a utilizao de dois vetores, um para armazenar o identificador do animal e outro para armazenar seu peso. Isso criou uma soluo com foco na manipulao das estruturas de dados, e no nos elementos fundamentais do problema, que so os animais. Imagine como seria mais fcil agrupar os dois tipos de dados em uma mesma estrutura, a qual descreve especificamente os dados de um elemento do mundo real, nesse caso, o boi. Em programas mais complexos, os registros fornecem uma maneira mais abstrata para representar os dados. A linguagem C++ oferece mecanismos para estruturar dados heterogneos, nos quais as informaes so compostas por diversos campos. Essas estruturas servem, basicamente, para agrupar

diversas variveis dentro de um nico contexto. Para ilustrar, vamos considerar o desenvolvimento do exerccio descrito no ltimo pargrafo. Nesse caso, cada boi pode ser representado por dois valores, um inteiro e um real. A sintaxe para a definio de uma estrutura esta: struct boi { int id; float peso; }; Dessa maneira, a estrutura boi passa a ser um tipo, e podemos ento declarar variveis desse tipo da seguinte forma: boi b; A linha de cdigo acima declara b como sendo uma varivel do tipo boi. Os elementos de uma estrutura podem ser acessados usando o operador de acesso ponto (.). Assim vlido escrever: b.id = 1263; b.peso = 513.84; Manipulamos os elementos de uma estrutura da mesma forma que manipulamos variveis simples. Podemos acessar seus valores, atribuir-lhes novos valores etc. 4.2.2. Registro de conjuntos Vimos anteriormente que possvel alocar mltiplos tipos de dados no interior de um registro. Alm disso, em C++ possvel definir um vetor, ou mesmo uma matriz, dentro de um registro, para no ser necessrio utilizar somente os tipos primitivos de dados. Vamos considerar, como exemplo, um sistema de cadastro de notas escolares. Nesse caso h a necessidade de se criar um registro denominado aluno, nos quais sero registradas as notas obtidas pelo aluno nos quatro bimestres do ano. Alm disso, deve ser registrado o nmero de matrcula do aluno e o seu nome. O trecho de cdigo abaixo ilustra a implementao desse registro: struct aluno { int matricula; string nome; float nota[4]; }; Como descrito anteriormente, os campos da estrutura so acessados usando o operador de acesso ponto(.). E ento manipulados de acordo com o contexto em que so utilizados. Assim, vlido escrever: aluno a; a.matricula = 12345; a.nome = "Aelerson"; a.nota[0] = 12.5; a.nota[1] = 17.2; a.nota[2] = 20.0; a.nota[3] = 19.7; 4.2.3. Conjunto de registros Com as tcnicas de programao anteriormente apresentadas, passou-se a ter uma flexibilidade bastante grande, podendo-se trabalhar de uma forma mais adequada com diversos problemas, principalmente os que envolvem a utilizao de dados heterogneos, facilitando a construo de programas mais organizados. Porm, os exemplos apresentados at aqui com a utilizao de registros, s fizeram meno leitura e escrita de um nico registro. Em C++ possvel fazer a manipulao de registros como conjuntos, a partir da criao de vetores e matrizes de registros. A declarao de um conjunto de registros feita de forma semelhante declarao de um vetor ou matriz, onde o nome do registro especificado na posio destinada ao nome do tipo de dado. O trecho de cdigo abaixo ilustra a declarao de um vetor de alunos contendo 90 posies: aluno a[90]; O acesso s posies do conjunto de registros realizado de forma semelhante ao acesso aos elementos de um conjunto de tipos primitivos. Assim, vlido escrever: a[0].matricula = 12345; a[0].nome = "Aelerson"; a[0].nota[0] = 12.5; a[0].nota[1] = 17.2; a[0].nota[2] = 20.0; a[0].nota[3] = 19.7;

4.3. Outros tipos de dados


Alm dos tipos de dados descritos anteriormente, a linguagem C++ possui contrutores para definio de outros tipos de dados. 4.3.1. Cadeia de caracteres (string) Um texto representado por uma seqncia de caracteres. A representao dessa seqncia de caracteres de fundamental importncia para o desenvolvimento de sistemas computacionais. Em qualquer tipo de cadastro necessrio informar cadeias de caracteres, como descrio de produtos, nomes de pessoas etc. Efetivamente, a linguagem C++ no oferece um tipo caractere. Como j discutimos, os caracteres so representados internamente na memria do computador por cdigos numricos. A linguagem C++ oferece ento o tipo char, que pode armazenar valores inteiros de 1 byte, 8 bits, podendo assim 8 representar 256 (2 ) valores distintos. Como os cdigos associados aos caracteres da tabela ASCII esto dentro desse intervalo, usamos o tipo char para representar caracteres. Embora a tabela ASCII seja a mais usada, diferentes mquinas podem usar diferentes tabelas de cdigos. Por isso deve-se evitar o uso explicito de cdigos referentes a uma determinada tabela, ou seja, deve-se usar char C = A no lugar de char C = 65. Em C++, a diferena entre caracteres e inteiros est apenas na maneira como so tratados. Por exemplo, podemos imprimir o mesmo valor de duas formas diferentes, a partir de formatos diferentes. Vamos analisar o trecho de cdigo abaixo: unsigned char I; for(I=1; I<255; I++) std::cout << (int)I << " - " << I << "\n"; Nesse caso, a varivel I, que foi inicializada com o valor 1, representa os caracteres da tabela da mquina na qual a aplicao est sendo executada. O objeto cout imprime o contedo da varivel I em dois formatos distintos: a representao numrica do caractere onde utiliza-se um casting para forar a impresso numrica; o formato de caractere onde ser impresso o caractere associado ao cdigo numrico. Cadeias de caracteres em C++ so representadas por vetores do tipo char terminadas, obrigatoriamente, pelo caractere nulo (\0). Portanto, para armazenar uma cadeia de caracteres, devemos reservar uma posio adicional para o caractere de fim da cadeia. O cdigo a seguir ilustra a representao de uma cadeia e caracteres. Como queremos representar a palavra CEFET, composta por 5 caracteres, declaramos um vetor com dimenso 6 (um elemento adicional para armazenarmos o caractere nulo no final da cadeia). O cdigo abaixo preenche os elementos do vetor, incluindo o caractere \0, e imprime a palavra na tela. int main() { char instituicao[6]; instituicao [0] = C; instituicao [1] = E; instituicao [2] = F; instituicao [3] = E; instituicao [4] = T; instituicao [5] = \0; std::cout << instituicao; return 0; } Se o caractere \0 no fosse colocado, o objeto cout poderia ser executado de forma errada, pois no conseguiria identificar o final da cadeia. Como cadeias de caracteres so vetores, podemos reescrever o cdigo anterior com a inicializao dos valores dos elementos do vetor na declarao: char instituicao[] = {C, E, F, E, T, \0}; A inicializao de cadeias de caracteres to comum em cdigo C++ que a linguagem permite que elas sejam inicializadas escrevendo-se os caracteres entre aspas duplas. Nesse caso, o caractere nulo representado explicitamente. O cdigo anterior pode ser reescrito da seguinte forma: char instituicao[] = CEFET;

4.3.2. Definio de novos tipos A linguagem C++ permite criar nomes de tipos. Por exemplo, se escrevemos: typedef float Real; Podemos usar o nome Real como um mnemnico para o tipo float. O uso de typedef muito til para abreviar nomes de tipos e para tratar tipos complexos. Alguns exemplos vlidos de typedef: typedef int Integer; typedef char String[256]; 4.3.3. Tipo pr-processado Um cdigo C++, antes de ser compilado, passa por um pr-processador. Esse pr-processador reconhece determinadas diretivas e altera o cdigo para, ento, envi-lo ao compilador. Uma diretiva muito comum, e j utilizada nos nossos exemplos, a diretiva #include. Ela seguida por um nome de arquivo, e o pr-processador a substitui pelo corpo do arquivo especificado. como se o texto do arquivo includo fizesse parte do cdigo-fonte. Outra diretiva de pr-processamento bastante usada a diretiva de definio, denominada #define. Por exemplo, uma funo para calcular a rea de um crculo pode ser escrita da seguinte forma: #define PI 3.14159F int main() { float area, r; cin >> r; AREA = PI * r * r; cout << "Area: " << area; return 0; } Nesse caso, antes da compilao, toda ocorrncia da palavra PI (desde que no esteja envolvida em aspas) ser trocada pelo nmero 3.14159F. O uso de diretivas de difinio para representar constantes simblicas fortemente recomendvel, pois facilita a manuteno e acrescenta clareza ao cdigo. 4.3.4. Tipo enumerao Uma enumerao um conjunto de constantes inteiras com nomes que especifica os valores possveis para uma varivel daquele tipo. uma forma mais elegante de organizar valores constantes. Como exemplo, consideremos a criao de um tipo booleano. Para isso, podemos enumerar os valores que um determinado tipo pode assumir. Isso pode ser feito da seguinte forma: enum bool { TRUE = 1, FALSE = 0 }; A declarao de uma varivel do tipo criado pode ser realizada por: bool resultado; resultado = FALSE; 4.3.5. Exerccios 1. Num frigorfico existem no mximo 90 bois. Cada boi traz, preso em seu pescoo, um carto contendo o seu nome, nmero de identificao (inteiro) e seu peso (real). Fazer um algoritmo que: imprima dados do boi mais gordo e do boi mais magro. imprima a soma dos pesos dos bois. Obs: -> somente uma funo poder ser executada por vez, e a escolha do usurio. -> somente o usurio poder encerrar a aplicao 2. Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para isso, montou uma ficha (uma para cada mercadoria) com o nome, o preo de compra e o preo de venda das mesmas. Fazer um programa que: Determine e escreva quantas mercadorias proporcionam: lucro < 10% 10% <= lucro <= 20% lucro > 20% Determine e escreva o valor total de compra e de venda de todas as mercadorias, assim como o lucro total.

Captulo 5: Modularizao de algoritmos


Para a construo de programas estruturados, sempre prefervel dividir as grandes tarefas de computao em tarefas menores e utilizar seus resultados parciais para compor o resultado final desejado. Na linguagem C++, a criao de funes o mecanismo adequado para codificar tarefas especficas. Um programa estruturado em C++ deve ser composto por diversas funes pequenas. Essa estratgia de codificao traz dois grandes benefcios: primeiro, facilita a codificao, pois codificar diversas funes pequenas, que resolvem problemas especficos, mais fcil do que codificar uma nica funo maior; segundo, funes especficas podem ser facilmente reutilizadas em outros cdigos. De fato, a criao de funes pode evitar a repetio de cdigo, de modo que um procedimento repetido deve ser transformado em uma funo que, ento, ser chamada diversas vezes. importante destacar que as funes so independentes entre si. As variveis locais definidas dentro do corpo de uma funo (includo os parmetros das funes) no existem fora dela. Cada vez que a funo executada, as variveis locais so criadas, e, quando sua execuo termina, as variveis deixam de existir.

5.1. Declarao de funes


A forma geral para definir uma funo : tipo_retornado nome_da_funo ( lista de parmetros... ) { corpo da funo }

5.2. Passagem de parmetros por valor


A passagem de parmetro por valor ocorre quando feita uma cpia dos valores contidos nas variveis, ou valores constantes, para os parmetros formais do mtodo chamado. Dessa forma, qualquer modificao que ocorra nas variveis locais ao mtodo invocado no afeta o valor de qualquer varivel usada como parmetro desse mtodo, ou seja, o processamento executado somente dentro do mtodo, ficando o resultado obtido preso dentro da subrotina. Para ilustrar a criao de funes, consideremos o clculo do fatorial de um nmero inteiro. Podemos escrever uma funo que, dado um determinado nmero inteiro no negativo n, imprime o valor de seu fatorial. // funo que calcula e retorna o valor do fatorial int fatorial(int n) { int i; int f = 1; for(i = n; i > 1; i--) f = f * i; return f; } int main( ) { int n, f; cin >> n; f = fatorial(n); cout << Fatorial de << n << eh << f; getch(); return 0; } Uma funo pode ou no ter um valor de retorno associado. Para ilustrar a possibilidade de uma funo no retornar um valor, vamos reescrever o cdigo anterior da seguinte forma. // funo que calcula e retorna o valor do fatorial void fatorial(int n) { int i; int f = 1; for(i = n; i > 1; i--) f = f * i; cout << Fatorial de << n << eh << f; }

int main( ) { int n; cin >> n; fatorial(n); getch(); return 0; } Observe que, nesse caso, a funo fatorial no retorna valor algum.

5.3. Passagem de parmetros por referncia


Conforme ilustrado anteriormente, uma funo pode retornar um tipo de valor. No entanto, a possibilidade de retornar um valor nem sempre satisfatria. Muitas vezes, precisamos retornar mais do que um resultado para o ponto de execuo que chama uma funo, e isso no pode ser feito com o retorno explcito de valores, pois dessa forma possvel retornar apenas um valor. A linguagem C++ permite o armazenamento e a manipulao de valores de endereos de memria. Para cada tipo existente, h um tipo ponteiro capaz de armazenar endereos de memria em que existem valores do tipo correspodente armazenados. A linguagem C no reserva uma palavra especial para a declarao de ponteiros; usamos a mesma palavra do tipo com os nomes das variveis precedidos pelo caractere *. Ento, podemos escrever: int *p; Nesse caso, declaramos uma varivel de nome p que pode armazenar endereos de memria em que existe um inteiro armazenado. Para atribuir e acessar endereos de memria, a linguagem C oferece dois operadores unrios. O operador uninrio & (endereo de), aplicado a variveis, resulta no endereo da posio da memria reservada para a varivel. O operador unrio * (contedo de), aplicado a variveis do tipo ponteiro, acessa o contedo do endereo de memria armazenado pela varivel ponteiro. Para exemplificar, observe o trecho de cdigo abaixo: int a = 15; int *b = &a; printf("%d\n", printf("%d\n", printf("%d\n", printf("%d\n", printf("%d\n", printf("%d\n",

a); &a); *&a); b); &b); *&b);

Os valores impressos sero: 15 endereo da varivel a 15 endereo da varivel a endereo da varivel b endereo da varivel a Podemos utilizar ponteiros para alterar valores de variveis ao acess-las indiretamente. Para tanto, se passarmos para uma funo os valores dos endereos de memria em que suas variveis esto armazenadas, essa funo pode alterar, indiretamente, os valores das variveis situadas no ponto de execuo que realizou a chamada funo. Para ilustrar, vamos considerar agora uma funo para realizar a troca de valores entre duas variveis. Assim, para que os valores possam ser trocados precisamos passar os endereos das variveis para a funo. O cdigo a seguir ilustra essa implementao. // funo que troca os valores entre duas variveis void troca(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; }

int main( ) { int a = 5, b=7; printf(Antes da troca: x=%d ; y=%d\n, a, b); troca(&a, &b); printf(Depois da troca: x=%d ; y=%d\n, a, b); getch(); return 0; }

5.4. Variveis globais


Outra forma de fazer a comunicao entre funes atravs de variveis globais. As variveis globais so declaradas fora do corpo das funes. Uma varivel global visvel a todas as funes subseqentes. Assim, qualquer uma dessas funes pode acessar e/ou alterar o valor da varivel diretamente. As variveis globais no so armazenadas na pilha de execuo, portanto no deixam de existir quando a execuo de uma funo termina; elas existem enquanto o programa estive sendo executado.

5.5. Exerccios
1. Implemente uma funo para testar se um nmero inteiro primo ou no. Se o valor retornado pela funo for 1, ento o nmero primo, se o valor for 0, ento o nmero no primo. 2. Implemente uma funo que retorne a soma dos n primeiros nmeros naturais mpares. 3. Implemente uma funo que calcule as razes de uma equao do segundo grau, do tipo ax + bx + c = 0. Essa funo deve ter como valor de retorno o nmero de razes reais e distintas da equao. Se existirem razes reais. Alm disso, deve ser possvel a impresso das razes da equao a partir do fluxo de execuo principal. 4. Implemente uma funo que calcule a rea da superfcie e o volume de uma esfera de raio r. A rea da superfcie e o volume so dados, respectivamente, por 4r e 4r /3. 5. Crie uma funo capaz de inverter um nmero qualquer fornecido pelo usurio. Ou seja, se o nmero informado pelo usurio for 123456789, o programa deve exibir o nmero 987654321. 6. Elabore uma funo que obtenha o mnimo mltiplo comum (MMC) entre dois nmeros fornecidos. 7. Crie uma funo que, a partir de um nmero informado pelo usurio, efetue o clculo do dgito verificador usando o algoritmo Mdulo 10. 8. Faa uma funo que calcule o Mximo Divisor Comum entre dois nmeros.
2 3 2

Referncias: CELES, W. e CERQUEIRA, R. e RANGEL, J. L. Introduo a estruturas de dados. 1 ed. Rio de Janeiro. Campus, 2004. SINTES, Anthony. Aprenda Programao Orientada a Objetos: em 21 dias. So Paulo: Pearson Education do Brasil. 2002. DEITEL, H. M.; DEITEL, P. J. C++: como programar. So Paulo: Pearson Prentice-Hall, 2006.

Вам также может понравиться