Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
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 (;)
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.
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.
/* 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;
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
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)
Expresses conectadas por && ou || so avaliadas da esquerda para direita, e a avaliao pra assim que a veracidade ou falsidade de resultado for conhecida.
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.
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; }
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.
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.
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.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.
int main( ) { int n; cin >> n; fatorial(n); getch(); return 0; } Observe que, nesse caso, a funo fatorial no retorna valor algum.
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.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.