





























































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
APOSTILA SOBRE C++, exercicios, resumos e muito mais
Tipologia: Resumos
1 / 69
Esta página não é visível na pré-visualização
Não perca as partes importantes!






























































C++
Este material apresenta uma coleção de algoritmos sobre uma variedade de estruturas de dados de memória principal, estudadas na disciplina de Estrutura de Dados – Algoritmos e Estruturas de Dados.
1 Aula.
1.1 Uma breve história do C++
O C++ foi inicialmente desenvolvido por Bjarne Stroustrup dos Bell Labs, durante a década de 1980 com o objetivo de implementar uma versão distribuída do núcleo do Unix. Como o Unix era escrito em C, dever-se-ia manter a compatibilidade, ainda que adicionando novos recursos.
O C foi escolhido como base de desenvolvimento da nova linguagem, pois possuía uma proposta de uso genérico, era rápido e também portável para diversas plataformas. Algumas outras linguagens que também serviram de inspiração para o cientista da computação foram ALGOL 68, Ada, CLU e ML.
Ainda em 1983 o nome da linguagem foi alterado de C with Classes para C++. Antes implementada usando um pré-processador, a linguagem passou a exigir um compilador próprio, escrito pelo próprio Stroustrup.
Novas características foram adicionadas, como funções virtuais, sobrecarga de operadores e funções, melhorias na verificação de tipo de dado e estilo de comentário de código de uma linha (//).
Em 1985 foi lançada a primeira edição do livro The C++ Programming Language , contendo referências para a utilização da linguagem, já que ainda não era uma norma oficial.
A primeira versão comercial foi lançada em outubro do mesmo ano.
Em 1989 a segunda versão foi lançada, contendo novas características como herança múltipla, classes abstratas, métodos estáticos, métodos constantes e membros protegidos, incrementando o suporte a orientação a objeto.
Assim como a linguagem, sua biblioteca padrão também sofreu melhorias ao longo do tempo.
Sua primeira adição foi a biblioteca de E/S, e posteriormente a Standard Template Library (STL); ambas tornaram-se algumas das principais funcionalidades que distanciaram a linguagem em relação a C.
Criada primordialmente na HP por Alexander Stepanov no início da década de 1990 para explorar os potenciais da programação genérica, a STL foi apresentada a um comitê unificado ANSI e ISO em 1993 à convite de Andrew Koenig.
Após uma proposta formal na reunião do ano seguinte, a biblioteca recebe o aval do comitê.
Pode-se dizer que C++ foi a única linguagem entre tantas outras que obteve sucesso como uma sucessora à linguagem C, inclusive servindo de inspiração para outras linguagens como Java, a IDL de CORBA e C#.
1.3 Estrutura Básica de um programa C++.
Temos abaixo a estrutura de um programa escrito na linguagem C++:
As duas primeiras linhas são o cabeçalho do programa. Todo programa deve ter um cabeçalho desse tipo para definir quais as bibliotecas ele utilizará. “Bibliotecas” são arquivos que normalmente são instalados juntos com o compilador e que possuem os comandos e funções pertencentes à linguagem.
#include<>
Serve para indicar ao compilador todas as bibliotecas que este programa utilizará. Na maioria dos programas que escreveremos durante esta apostila, só utilizaremos o
#include
,que serve para incluir a biblioteca iostream em nossos programas.
Esta biblioteca contém as principais funções, comandos e classes de entrada e saída de C++, necessárias para realizar programas que, por exemplo, recebam dados via teclado e enviem dados via monitor.
A segunda linha do cabeçalho,
using namespace std;
, é um aviso ao compilador que estaremos utilizando os comandos e funções padrão de C++.
Ele é necessário porque em C++ podemos criar várias bibliotecas para serem utilizáveis em vários programas.
Cada uma dessas bibliotecas contém comandos, classes e funções próprias, e para evitar confusões e problemas com os nomes destes comandos, utilizamos o cabeçalho “using namespace ...;” para definir qual o campo de nomes que estamos utilizando.
Num programa normal, que não utiliza outras bibliotecas além do padrão de C++, utilizamos o namespace std como nosso campo de nomes de comandos e funções. Assim, sempre que utilizamos um comando próprio de C++, o compilador reconhecerá automaticamente este comando como sendo pertencente à biblioteca padrão de C++.
Assim como em C++, tudo o que acontece durante a execução do programa está contido dentro de uma função principal, chamada main. Declaramos a função main com:
int main ( )
Todos os comandos executados pelo programa estão contidos entre as chaves “{ }” da função main.
O encerramento de um programa geralmente é feito da mesma maneira para todos eles. As duas últimas linhas antes do fecha-chaves são dois comandos normalmente utilizados ao fim de um programa.
system(“PAUSE > null”)
é uma chamada de função própria de C++.
A função system( ) recebe argumentos como o PAUSE que na verdade são comandos para o sistema operacional. Neste caso, ela recebe o comando “PAUSE > null” para pausar a execução do programa até que o usuário aperte uma tecla qualquer. Utilizamos este recurso para que a tela do programa não seja terminada automaticamente pelo sistema, impedindo que vejamos os resultados do programa.
Finalmente, o comando
return 0
é a “resposta” da função main para o sistema.
1.4 Tipos de Variáveis
Quando definimos uma variável em C++, precisamos informar ao compilador o tipo da variável: um número inteiro, um número de ponto flutuante, um caractere, e assim por diante. Essa informação diz ao compilador quanto espaço deve ser reservado na memória para a variável, e o tipo de valor que será armazenado nela. As variáveis mais utilizadas, em um curso de C++ básico são: A tabela abaixo apresenta os tipos para valores numéricos inteiros.
A linguagem oferece ainda dois tipos básicos para a representação de números reais (ponto flutuante): float e double. A tabela abaixo compara estes dois tipos.
A constante x não poderá deixar de ter valor igual a 4. Qualquer tentativa de modificar o valor da constante ao longo do programa será reportada como erro pelo compilador.
1.6 O comando Include e as Bibliotecas.
C++ tem a capacidade de importar bibliotecas. A importância da biblioteca em C é imensa, pois ela nos poupa de muita programação. Uma vez que a função já está pronta dentro da biblioteca, basta importar tal biblioteca e utilizar a função que queremos.
Caso quiséssemos mostrar uma mensagem na tela, você não tem que produzir uma função inteira ou criar um comando novo, basta importar a biblioteca <iostream.h>, que possui a finalidade de I/O (entrada e saída) de dandos. Quando o programa for compilado, o compilador irá buscar nas bibliotecas exigidas pelo usuário tais funções para saber como utilizá-las no programa. O papel do pré-processamento é indicar, antes mesmo de compilar, os parâmetros necessários para ser criado o arquivo executável.
A importação de uma biblioteca é dada pelo comando # include (incluir) seguido da biblioteca entre os sinais de menor (<) e maior (>).
Como importar a biblioteca padrão de entrada e saída de C++.
As bibliotecas de C são diferentes das bibliotecas de C++. Apesar de muitos compiladores de C++ suportarem as bibliotecas de C, nenhum compilador exclusivamente de C suporta bibliotecas de C++.
1.7 Biblioteca <Math.h>.
A biblioteca <math.h> nos ajuda nos cálculos matemáticos, onde podemos encontrar facilmente funções para calcular potências, raíz quadrada, funções trigonométricas para cálculos que envolvem seno, co-seno e tangente, além de constantes para números irracionais como, por exemplo, PI (Π) e √2.
sin () : Retorna o valor do seno. Recebe como argumento o valor dos graus em double.
cos () : Retorna o valor do co-seno. Recebe como argumento o valor dos graus em double.
tan () : Retorna o valor da tangente. Recebe como argumento o valor dos graus em double.
log (): Retorna o valor do logaritmo na base 2. Exige um argumento do tipo double.
log10 (): Retorna o valor do logaritmo na base 10. Exige um argumento do tipo double.
sqrt (): Retorna o valor da raiz quadrada. Recebe como argumento um double do qual ele deve extrair a raiz.
pow (): Retorna o valor da base elevada ao expoente. Recebe dois argumentos do tipo double, o primeiro é a base e o segundo o expoente. Por exemplo: se quisermos saber o resultado da operação 210,faríamos pow (2, 10).
1.8 Operadores.
A linguagem C++ oferece uma gama variada de operadores, entre binários e unários. Os operadores básicos são apresentados a seguir.
adição (+);
subtração (-);
multiplicação (*);
divisão (/);
operador módulo (%).
A linguagem também permite utilizar os chamados operadores de atribuição compostos.
Comandos do tipo:
i = i + 2; em que a variável à esquerda do sinal de atribuição também aparece à direita, podem ser escritas de forma mais compacta:
i += 2.
Usando o operador de atribuição composto +=. Analogamente, existem, entre outros, os operadores de atribuição: -=, *=, /=, %=. De forma geral, comandos do tipo:
var op= expr;
são equivalentes a:
var = var op (expr);
Salientamos a presença dos parênteses em torno de expr. Assim:
x *= y + 1;
equivale a
x = x * (y + 1)
e não a
x = x * y + 1;
Os dois operadores não convencionais. São os operadores de incremento e decremento, que possuem precedência comparada ao - unário e servem para incrementar e decrementar uma unidade nos valores armazenados nas variáveis. Assim, se n é uma variável que armazena um valor, o comando:
n++;
incrementa de uma unidade o valor de n (análogo para o decremento em n--). O aspecto não usual é que ++ e -- podem ser usados tanto como operadores pré-fixados (antes da variável, como em ++n) ou pós-fixados (após a variável, como em n++). Em ambos os casos, a variável n é incrementada. Porém, a expressão ++n incrementa n antes de usar seu valor, enquanto n++ incrementa n após seu valor ser usado. Isto significa que, num contexto onde o valor de n é usado, ++n e n++ são diferentes. Se n armazena o valor cinco, então:
x = n++; atribui 5 a x, mas:
x = ++n;
atribuiria 6 a x. Em ambos os casos, n passa a valer 6, pois seu valor foi incrementado em uma unidade. Os operadores de incremento e decremento podem ser aplicados somente em variáveis; uma expressão do tipo x = (i + 1)++ é ilegal.
Mesmo para programadores experientes, o uso das formas compactas deve ser feito com critério. Por exemplo, os comandos:
a = a + 1;
a += 1;
a++;
++a;
são todos equivalentes e o programador deve escolher o que achar mais adequado e simples. Em termos de desempenho, qualquer compilador razoável é capaz de otimizar todos estes comandos da mesma forma.
Estes operadores comparam dois valores. O resultado produzido por um operador relacional é zero ou um. Em C++, não existe o tipo booleano (true ou false). O valor zero é interpretado como falso e qualquer valor diferente de zero é considerado verdadeiro. Assim, se o resultado de uma comparação for falso, produz-se o valor 0, caso contrário, produz-se o valor 1.
Expressões conectadas por && ou || são avaliadas da esquerda para a direita, e a avaliação pára assim que a veracidade ou falsidade do resultado for conhecida. Recomendamos o uso de parênteses em expressões que combinam operadores lógicos e relacionais.
Os operadores relacionais e lógicos são normalmente utilizados para tomada de decisões. No entanto, podemos utilizá-los para atribuir valores a variáveis. Por exemplo, o trecho de código abaixo é válido e armazena o valor 1 em a e 0 em b.
1.10 Entrada e saída básicas.
Em C++ tudo é feito através de funções, inclusive as operações de entrada e saída. Por isso, já existe em C uma biblioteca padrão que possui as funções básicas normalmente necessárias. Na biblioteca padrão de C++, podemos, por exemplo, encontrar funções matemáticas do tipo raiz quadrada, seno, cosseno, etc., funções para a manipulação de cadeias de caracteres e funções de entrada e saída. Nesta seção, serão apresentadas as duas funções básicas de entrada e saída disponibilizadas pela biblioteca padrão. Para utilizá-las, é necessário incluir o protótipo destas funções no código. Este assunto foi abordado na seção 1.6.
Por ora, basta saber que é preciso escrever:
#include <iostream.h> C++.
#include <stdio.h> C;
cout << “Exemplo”<<endl; C++.
cout é o dispositivo de saída padrão no C++ (geralmente o monitor), e a frase completa insere uma seqüência de caracteres no dispositivo de saída. O cout é declarado no arquivo de cabeçalho <iostream.h>, então pra que seja possível utiliza-lo, esse arquivo precisa ser incluso. Note que a frase termina com um caractere ponto-e-vírgula (Esse caractere significa o fim da instrução e precisa ser incluído após toda instrução em qualquer programa em C++ )Um dos erros mais comuns dos programadores de C++ é devido ao fato de esquecerem de incluir um ponto-e-vírgula; no final de cada instrução.
printf (formato, lista de constantes/variáveis/expressões...); C;
O primeiro parâmetro é uma cadeia de caracteres, em geral delimitada com aspas, que especifica o formato de saída das constantes, variáveis e expressões listadas em seguida. Para cada valor que se deseja imprimir, deve existir um especificador de formato correspondente na cadeia de caracteres formato. Os especificadores de formato variam com o tipo do valor e a precisão em que queremos que eles sejam impressos. Estes especificadores são precedidos pelo caractere % e podem ser, entre outros:
Alguns exemplos em C: printf ("%d %g\n", 33, 5.3); tem como resultado a impressão da linha: 33 5. Ou: printf ("Inteiro = %d Real = %g\n", 33, 5.3); com saída: Inteiro = 33 Real = 5.
isto é, além dos especificadores de formato, podemos incluir textos no formato, que são mapeados diretamente para a saída. Assim, a saída é formada pela cadeia de caracteres do formato onde os especificadores são substituídos pelos valores correspondentes. Existem alguns caracteres de escape que são freqüentemente utilizados nos formatos de saída. São eles:
Ainda, se desejarmos ter como saída um caractere %, devemos, dentro do formato, escrever %%.
É possível também especificarmos o tamanho dos campos:
A função printf retorna o número de campos impressos. Salientamos que para cada constante, variável ou expressão listada devemos ter um especificador de formato apropriado.
cin>>variável; C++
A entrada padrão no C++ é feita aplicando-se o operador sobrecarregado de extração (>>) no comando cin. Isso precisa ser seguido pela variável que irá guardar o dado que será lido.
Declarando a variável como desejada, então espera por uma entrada do cin (teclado) para que possa guardá-la em um espaço reservado da memória ROM. O comando cin só pode processar a entrada do teclado depois que a tecla ENTER for pressionada. Sendo assim, mesmo que você peça um único caractere, o cin não irá processar a entrada até que o usuário pressione ENTER depois que o caractere tenha sido digitado. Você precisa sempre considerar o tipo da variável que você está usando para guardar o valor extraído pelo cin. Se você pedir um inteiro, você receberá um inteiro, se você
Os métodos de tomada de decisão no C++ estão presentes para as tarefas mais corriqueiras que o programa deve executar.
Uma ação muito importante que o processador de qualquer computador executa, e que o torna diferente de qualquer outra máquina, é a tomada de decisão definindo o que é verdadeiro e o que é falso.
É possível observar que podemos criar um programa com quantas condições queremos, restringindo a cada condição, uma ação ou um conjunto de ações.
Alguns exemplos para serem refeitos.
Elabore um programa que diga qual ação, ou ações foram escolhidas:
a) Ação 1: caso o número seja maior ou igual a 2.
b) Ação 2: caso o número seja maior que 1.
c) Ação 3: caso não seja satisfeita nenhuma condição.
Observe que o erro encontra-se no uso do “ else if ”, com ele, excluímos possibilidades possíveis de respostas. Por exemplo, se digitarmos o número 3 no programa acima, o compilador nos dará como saída apenas a primeira condição ("Ação 1 escolhida”), onde na verdade temos duas respostas, pois satisfaz a ação 1 e 2 simultaneamente. Se substituirmos o “ if ” no lugar do “ else if” , o compilador nos dará as 2 respostas possíveis ("Ação 1 escolhida” e "Ação 2 escolhida”), com isso, corrigiríamos o problema da redundância do nosso exemplo. Com o uso apenas do “if” e do “else” é possível o compilador executar várias condições que ocorram simultaneamente.
Exemplos de Aplicação.
1. Dados dois números reais quaisquer, desenvolva um programa que diga se eles são iguais ou diferentes. Solução: