Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


apostilacpp, Notas de estudo de Informática

Programação em C++

Tipologia: Notas de estudo

2015

Compartilhado em 08/02/2015

luis_fernando3
luis_fernando3 🇵🇹

1 documento

1 / 122

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Aprenda a Programar
6deoutubrode2014
Curso em C++
Alan Robert Resende de Freitas
Departamento de Computação
Universidade Federal de Ouro Preto
Apostila disponível em: www.alandefreitas.com
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe apostilacpp e outras Notas de estudo em PDF para Informática, somente na Docsity!

Aprenda a Programar

6 de outubro de 2014

Curso em C++

Alan Robert Resende de Freitas

Departamento de Computação

Universidade Federal de Ouro Preto

Apostila disponível em: www.alandefreitas.com

Sumário

  • 1 Introdução
  • 2 Sobre a Linguagem C++
  • 3 Compilador
  • 4 Tipos de Dados
  • 5 Programas sequenciais
    • 5.1 Primeiros Programas em C++
      • 5.1.1 Primeiro programa em C++
      • 5.1.2 Segundo programa em C++
      • 5.1.3 Comentários
      • 5.1.4 Criando variáveis
      • 5.1.5 Identificadores
    • 5.2 Operadores
      • 5.2.1 Operador de atribuição
      • 5.2.2 Fluxo de entrada
      • 5.2.3 Alterações possíveis
      • 5.2.4 Operadores aritméticos
      • 5.2.5 Operadores de atribuição aritméticos
      • 5.2.6 Operadores de incremento e decremento I
      • 5.2.7 Operadores prefixados ou de pós-incremento
      • 5.2.8 Operadores de increemento e decremento II
      • 5.2.9 Dados lógicos
      • 5.2.10 Operadores relacionais
      • 5.2.11 Operadores lógicos
      • 5.2.12 Exemplos
      • 5.2.13 Resumo do operador “E” lógico
      • 5.2.14 Resumo do operador “OU” lógico
      • 5.2.15 Resumo do operador “NÃO” lógico
      • 5.2.16 Exemplo
  • 6 Estrutura condicional
    • 6.1 Condicional se
      • 6.1.1 Sintaxe do se
    • 6.2 Se-senão
      • 6.2.1 Se-senão sintaxe
    • 6.3 Se-senão aninhados
      • 6.3.1 Se-senão alinhados- sintaxe
    • 6.4 Outros operadores condicionais
      • 6.4.1 Operador ternário
      • 6.4.2 Switch
  • 7 Operador de endereço
  • 8 Arranjos
    • 8.1 Arranjos simples
    • 8.2 Cadeias de caracteres
    • 8.3 Classe string
    • 8.4 Arranjos multidimensionais
  • 9 Estrutra de repetição para controle de fluxo
    • 9.1 Laços com contadores
      • 9.1.1 Variável contadora
      • 9.1.2 Repetiçao controlada por contador
      • 9.1.3 Controle de fluxo-For
      • 9.1.4 Repetições determinadas pelo usuário
    • 9.2 Repetição de processos similares
    • 9.3 Alterando variáveis externas
    • 9.4 Aninhando estrutura de controle
    • 9.5 Condiçoes de inicialização
    • 9.6 Condições de incremento
    • 9.7 Percorrer arranjos
    • 9.8 Laços aninhados
    • 9.9 Percorrer arranjos de arranjos
    • 9.10 Utilizando apenas critério de parada
      • 9.10.1 Convertendo while em for
      • 9.10.2 Convertendo for em while
      • 9.10.3 Laços infinitos
    • 9.11 Introdução ao do-while
      • 9.11.1 Convertendo do-while e while
  • 10 Escopo de variáveis
  • 11 Ponteiros
    • 11.1 Expressões com ponteiros
      • 11.1.1 Aritmética com ponteiros
      • 11.1.2 Ponteiros para ponteiros
  • 12 Ponteiros e arranjos
  • 13 Modularização de programas com funções
    • 13.1 Funções simples
      • 13.1.1 Minha primeira função
    • 13.2 Funções e o escopo de suas variáveis
      • 13.2.1 Cabeçalho de função
      • 13.2.2 Funções e suas variáveis
    • 13.3 Retorno de valor
    • 13.4 Parâmetro de função
    • 13.5 Passagem de parâmetros
      • 13.5.1 Passagem de parâmetros por valor
      • 13.5.2 Passagem de parâmetros por referêrencia
    • 13.6 Omitindo a variável de retorno
    • 13.7 Retornando vários valores
    • 13.8 Váriaveis (ou constantes) não alteradas em funções
    • 13.9 Arranjos como parâmetros
    • 13.10Ponteiros como parâmentros
    • 13.11Recursão
  • 14 Estruturas
    • 14.1 Introdução
      • 14.1.1 Sintaxe
    • 14.2 Arranjos de estruturas
    • 14.3 Ponteiros e estruturas
  • 15 Alocação automática de memória
  • 16 Alocação dinâmica de memória
  • 17 Processamento de arquivos sequenciais

1 Introdução

Esta apostila se baseia no curso de programação lecionado na Universidade Federal de Ouro Preto. Em caso de erros na apostila, por favor, nos avise em [email protected]. Sabemos que a utilização de computadores é claramente uma vantagem em nossas vidas. O computador é um facilitador da nossa comunicação, do nosso planejamento e essa praticidade nos permite trabalhar menos e nos fornece diversão. Mas por que fazer nossos próprios programas? Uma resposta simples para isso é que tudo é uma questão de automatização. Existe uma citação de Bill Gates que exprime bem essa ideia.

“Sempre escolherei pessoas preguiçosas para realizar trabalhos difíceis, pois os mesmos buscam os caminhos mais fáceis para fazê- los”.(Bill Gates).

Sendo assim, você já parou para pensar em quantas tarefas repetitivas te- mos em nossas vidas? Em nossa profissão? Na família? Nós programadores costumamos ter ferramentas próprias para o dia-a-dia: calendários, lembretes, processadores de dados, e várias outras. A programação é necessária em tarefas avançadas de todas as áreas do co- nhecimento. Cálculo é uma delas. Muitos problemas matemáticos só puderam ser resolvidos por causa da capacidade dos computadores atuais. Todo ano, milhares de problemas novos e mais difíceis são solucionados. Outra vantagem de se saber programar é saber por que um computador pode falhar. Nós programadores, usualmente, reconhecemos o motivo de erros em programas. Isso só acontece porque já passamos pelos mesmos erros em nossos próprios programas. Além disso, a programação te ajuda a pensar e a quebrar problemas grandes em partes menores. O único limite no seu programa vai ser a sua imaginação. Uma ideia simples pode mudar a vida de milhões de pessoas.

2 Sobre a Linguagem C++

A linguagem C++ foi desenvolvida por Bjarne Stroustrup quando traba- lhava para a Bell Labs, durante a década de 1980. Nesta época, o Unix, sistema operacional também desenvolvido pela Bell Labs, era desenvolvido na linguagem C. Era importante que fosse mantida compatibilidade entre a nova linguagem C++ e a antiga linguagem C. Então em 1983 o nome da linguagem foi alterado de “C com Classes”, C with Classes em inglês, para C++. Uma novidade importante da linguagem C++ é que ela contém uma biblioteca padrão de recursos que também foi sendo melhorada ao longo do tempo. Uma característica importante do C++ é ser considerada de médio nível. Isso que dizer que ela não é tão distante da linguagem da máquina, a língua

Tipos de dados Representação Exemplos Tipo lógico bool V ou F Números inteiros short < int < long ... -3, -2, -1, 0, 1, 2, 3 ... Números reais float < double 3.32, 4.78, 7.24, -3.14, 0. Caracteres char a, b, c, d, e, f ...#, $, [, ., \ ..

5 Programas sequenciais

5.1 Primeiros Programas em C++

5.1.1 Primeiro programa em C++

Para criarmos nosso primeiro programa em C++ começaremos com este código.

1 # include < iostream > 2 3 int main (){ 4 std :: cout << " Olá ￿ mundo! " << std :: endl ; 5 return 0; 6 }

O comando apresentado na primeira linha, #include , inclui a biblioteca com recursos para fluxo de entrada e saída, chamados também de in ou out stream. Quando dizemos entrada, essa será feita usualmente via teclado. Quando dizemos saída, essa será feita pelo monitor.

É na terceira linha que se começa a função principal do nosso programa, chamada de main() em inglês. As chaves indicam onde começa e termina essa função. Logo em seguida vem o comando cout. Dizemos que cout é um objeto que faz saída de dados para o monitor. Esses dados são enviados para ele em cadeia com os operadores de inserção ( << ), que estão a sua direita. Para evitar um possível conflito entre os nomes, os recursos do C++ são divididos em espaços de nomes. O cout, por exemplo, é precedido de std e dois pontos seguidos (: :) para indicar que ele pertence ao espaço de nomes padrão da linguagem, conhecido também como standard.

Temos agora, na terceira linha, como o operador de inserção é então utilizado para enviar a frase “Olá, Mundo!” para cout. Cada letra desta frase é um dado do tipo char, que representa um caractere. As aspas ao redor da expressão “Olá, Mundo!” indicam que este é um con- junto de chars, e não uma palavra especial que é reservada da linguagem.

Além desta frase, uma quebra de linha após a frase é também enviada para cout. Essa quebra de linha é representada pelo comando endl, que também pertence a std. Saibam que todos os comandos em C++ DEVEM ser acompanhados de um ponto e vírgula indicando a onde termina aquele comando.

O comando return ( que significa retornar em inglês), indica que a função encerra naquele ponto, finalizando assim, o programa. Mas esse comando não só encerra como também retorna um valor do tipo int. O comando int, antes da definição main() indica que a própria função main irá retornar um int. Discutiremos o significado desse comando em lições futuras. Lembre-se que a função main é obrigatória em todos os programas.

Este é o resultado do programa acima:

Olá, Mundo!

5.1.2 Segundo programa em C++

1 # include < iostream > 2 3 using namespace std ; 4 5 int main (){ 6 cout << " Olá , ￿ Mundo " << endl ; 7 return 0; 8 }

Neste segundo programa em C++, indicamos que o espaço de nomes namespace std deve ser utilizado se nenhum espaço for mencionado. Eliminamos assim os vários stds e dois pontos seguidos (::) em nosso código. Como podem ver, as variáveis em C++ são organizadas em espaços de nomes para evitar conflito entre duas variáveis que tenham o mesmo identificador.

O programa acima irá mostrar na tela a seguinte mensagem:

Olá, Mundo!

5.1.3 Comentários

Em Alguns casos, um código pode se tornar muito complexo que nem o próprio programador consegue entendê-lo. Em casos como este, é bom deixar comentários para outros programadores.

5.1.4 Criando variáveis Os dados do nosso programa serão guardados em variáveis e para isso é necessário informar qual o tipo de dado de cada uma. Para cada variável, damos a ela um nome identificador que a referencia.

1 # include < iostream > 2 3 using namespace std ; 4 int main (){ 5 int numero ; // criando uma variável do tipo inteira com nome x 6 char letra ; // criando uma variável do tipo char com o nome letra 7 double num_real ; // criando uma variável do tipo double com nome num_ 8 bool teste ; // criando uma variável do tipo bool com nome teste 9 cout << " Este ￿ programa ￿ criou ￿ 4 ￿ variáveis! " << endl ; 10 return 0; 11 }

Neste exemplo, temos um programa onde 4 variáveis são criadas. A primeira delas (linha 5) irá guardar um número inteiro. Note que o nome que identifica a variável (numero) não contém acentos. Depois criamos uma variável (letra), para dados do tipo char. Em seguida, na linha 7, uma variável do tipo double, que pode armazenar números reais. E por fim na linha 8, uma variável do tipo bool, que pode guardar dados lógicos, como verdadeiro ou falso. Finalmente na próxima linha, este programa imprime uma mensagem sim- ples.

Este programa criou 4 variáveis!

Por enquanto, nosso programa não utilizou às variáveis criadas.

5.1.5 Identificadores Os identificadores são usados para dar nomes às variáveis ou funções que criamos. Estudaremos as funções mais adiante. O primeiro caractere de um identificador deve ser uma letra ou sinal de sublinha. Nomes como 8nome ou @nome não são válidos. As letras minúsculas e maiúsculas também são iden- tificadas de formas diferentes. Ou seja, para o C++, uma variável x minúsculo é diferente de uma variável X maiúsculo.

5.2 Operadores

Os operadores são muito importantes em programação, pois eles alteram o valor das variáveis ou usam variáveis existentes para criarem novas.

5.2.1 Operador de atribuição

O operador representado pelo sinal de igualdade (=) em C++ não diz que dois valores são iguais. Ele na verdade, atribui o valor da direta à variável. Por isto, chamamos ele de operador de atribuição. Sendo assim, não confunda este operador de atribuição com um operador de igualdade. Ele transfere um valor a uma variável e esse valor pode ser utilizado posteriormente. Quando fazemos isto, o valor antigo da variável é perdido.

Neste código utilizaremos um operador de atribuição para dar um valor a uma variável.

Logo no início do código, criamos 2 variáveis que receberão seus valores através do fluxo de entrada. O comando que aparece na oitava linha imprime uma mensagem pedindo ao usuário que execute uma ação. Repare que não há o comando endl para passar para a próxima linha. cin, depois da oitava linha, é usado para obter um valor que virá do usuário pelo teclado. Por isto, o programa fica parado até que o usuário digite um valor e aperte a tecla Enter. Vamos supor que o valor 3.14 tenha sido digitado. Esse valor é, então, guardado na variável.

digite o primeiro numero: 3.

Vamos agora para o próximo passo na décima linha. O programa espera uma entrada de dados novamente e recebe o valor 2.7.

digite o segundo numero: 2.

Logo após, na linha 12, é atribuido à variável soma o valor numero1 somado com o valor numero2. Este é o fim do programa.

A soma dos numeros é 5.

5.2.3 Alterações possíveis Vejamos agora as alterações possíveis no programa. É possível termos uma lista separada por vírgulas para declaração das variáveis do mesmo tipo, como a acontece na quinta linha. Apesar de possível, é mais interessante fazer a declaração de variáveis separadamente, pois isso nos permite inserir comentários mais facilmente.

1 # include < iostream > 2 3 using namespace std ; 4 int main (){ 5 double numero1 , numero2 , soma ; 6 cout << " digite ￿ o ￿ primeiro ￿ numero : ￿ " ; 7 cin >> numero1 ; 8 cout << " digite ￿ o ￿ segundo ￿ numero : ￿ " ; 9 cin >> numero2 ; 10 soma = numero1 + numero2 ; 11 cout << " A ￿ soma ￿ dos ￿ numeros ￿ é ￿ " << soma << endl ; 12 return 0; 13 }

Uma segunda alteração possível é esta. Neste código, fizemos a adição dos dois números diretamente nos parâmetros do cout, na linha 11. Assim, utiliza- mos uma variável a menos. Após o comando com cout, o resultado da soma é descartado.

1 # include < iostream > 2 3 using namespace std ; 4 int main (){ 5 double numero1 , numero2 ; 6 cout << " digite ￿ o ￿ primeiro ￿ numero : ￿ " ; 7 cin >> numero1 ; 8 cout << " digite ￿ o ￿ segundo ￿ numero : ￿ " ; 9 cin >> numero2 ; 10 soma = numero1 + numero2 ; 11 cout << " A ￿ soma ￿ dos ￿ numeros ￿ é ￿ " << numero1 + numero2 << endl ; 12 return 0; 13 }

5.2.4 Operadores aritméticos Além do operador de atribuição, representado por um sinal de igualdade (=), existem também os operadores aritméticos. Esses são utilizados principalmente para tipos de dados que representam números. Já utilizamos um operador aritmético de soma, representado pelo próprio sinal de mais (+), no exemplo anterior. Os operadores aritméticos podem também ser utilizados para outros tipos de dados, tendo nestes casos outros significados. Como operador de adição você utiliza um sinal de mais (+). Para subtração, o sinal de menos (-). Para multiplicação, um asterisco (*). E para divisão, um sinal de barra da esquerda para a direita (/). Temos ainda um operador para o resto da divisão inteira, representado pelo símbolo de porcentagem (%). Tabela com todos os operadores artiméticos: Operador Comando Adição + Subtração - Multiplicação * Divisão / Resto da divisão inteira %

Fazemos o mesmo com o operador de subtração, de multiplicação e o de divisão. Repare que o resultado da divisão de 7 por 2 é 3 e não 3.5. Isto acontece porque r é uma variável do tipo int, que representa apenas números inteiros. Veja enfim, o operador de resto da divisão inteira, e esse é o fim de nosso programa.

Digite o primeiro numero 7 Digite o segundo numero 2 Adição dos numeros = 9 Subtração dos numeros = 5 Multiplicação dos numeros = 14 Divisão dos numeros = 3 Resto da divisão = 1

5.2.5 Operadores de atribuição aritméticos

Existem outros operadores de atribuição além do operador representado pelo sinal de igualdade. Esses outros operadores de atribuição são utilizados para abreviar expressões aritméticas e devem ser utilizados sempre que possível. Imagine qualquer instrução onde somamos uma variável c mais 2 e atribuímos o resultado à própria variável c. Isto pode ser convertido na forma c mais igual a dois (c += 2). Uma outra maneira em um caso mais geral é: considere qualquer comando onde atribuímos uma variável com uma constante à própria variável. Isto pode ser convertido em um comando com a variável, o operador, um sinal de igualdade e a expressão.

Quando usamos o operador de adição (+) e o de atribuição (=), no exemplo: x, operador de adição e atribuição e 6 (x += 6), temos uma expressão equivalente a: x, operador atribuição, x, sinal de adição e o 6 (x = x + 6). Ou seja, nos dois casos, x recebe seu próprio valor mais 2.

Quando utilizamos operador de subtração (-) e atribuição, no exemplo: x, operador de subtração e de atribuição e 3 (x -= 3), temos como significado que x recebe seu próprio valor menos 3.

Se utilizarmos o operador de multiplicação (*) e de atribuição temos: x, operador de multiplicação e de atribuição e 2 (x *= 2), o que significa que x receberá seu próprio valor multiplicado por 2.

Agora, se usarmos o operador de divisão (/) e de atribuição no exemplo: x, operador de divisão e de atribuição e 4 (x /= 4), temos como significado que x receberá seu próprio valor dividido por 4.

Por fim, quando utilizamos o operador de resto da divisão inteira (%) e atribuição temos o exemplo: x, operador resto da divisão inteira e de atribuição

e 7 (x %= 7). Isto quer dizer que x receberá o resto da divisão de seu próprio valor por 7. Tabela com todos os operadores de atribuição artméticos: Operador Exemplo Significado += x += 6 x = x + 6 -= x -= 3 x = x - *= x *= 2 x = x * 2 /= x /= 4 x = x / 2 %= x %= 7 x = x % 7

Neste exemplo, utilizamos os operadores de atribuição aritméticos.

1 # include < iostream > 2 3 using namespace std ; 4 int main (){ 5 int numero1 ; 6 int numero2 ; 7 int r ; 8 cout << " digite ￿ o ￿ primeiro ￿ numero : ￿ " ; 9 cin >> numero1 ; 10 cout << " digite ￿ o ￿ segundo ￿ numero : ￿ " ; 11 cin >> numero2 ; 12 numero1 += numero2 ; 13 cout << " Somando " << numero2 << " ->" << numero1 << endl ; 14 numero1 -= numero2 ; 15 cout << " Subtraindo " << numero2 << " ->" << numero1 << endl ; 16 numero1 *= numero2 ; 17 cout << " Multiplicando ￿ por " << numero2 << " ->" << numero1 << endl ; 18 numero1 /= numero2 ; 19 cout << " Dividindo ￿ por " << numero2 << " ->" << numero1 << endl ; 20 numero1 %= numero2 ; 21 cout << " Resto ￿ da ￿ divisão ￿ por " << numero2 << " ->" << numero1 << endl ; 22 return 0; 23 }

São criadas nossas variáveis nas linhas 5 e 6, em seguida, os valores são atribuídos a elas.

digite o primeiro numero 8 digite o segundo numero 3

Na linha 12, o comando (+=) equivale a dizer que numero1 recebe o próprio valor de numero1 mais o valor de numero2.

5.2.6 Operadores de incremento e decremento I Trabalharemos agora com os operadores de incremento e decremento, que são utilizados também para alterar o valor de variáveis. Estes operadores são usados para adicionar ou subtrair somente uma unidade do valor de uma variá- vel, respectivamente. O operador de incremento, é representado por dois sinais de adição seguidos (++), ele serve para incrementar em uma unidade, o valor de uma variável qualquer (x++). Como esta é uma operação comum, isto diminui o trabalho de dizermos que x recebe x mais 1 (x = x + 1), ou que x deve receber seu próprio valor mais 1.

5.2.7 Operadores prefixados ou de pós-incremento O operador prefixado pode ser representado colocando os dois sinais de adição ou subtração antes da variável (++x ou --x). Para cada caso, o operador e o nome da variável deve ser em sequência, sem espaços. Já o operador de pós-incremento ou pós-decremento pode ser representado pelo nome da variável seguido, sem espaços, de dois sinais de adição subtração (x++ ou x--). O operador prefixado incrementa o valor da variável antes de a usar. Apenas após o alteração, ela é utilizada com o valor modificado na expressão em que aparece. O operador de pós-incremento ou pós-decremento altera o valor da variável apenas depois que a mesma é utilizada na expressão em que aparece.

Quadro geral com os operadores de incremento e decremento: Significado Representação Utiliza e depois incrementa i++ Incrementa e depois utiliza ++i Utiliza e depois decrementa i-- Decrementa e depois utiliza --i

5.2.8 Operadores de increemento e decremento II Assim, para utilizar e depois incrementar usamos i mais mais (i++). Para incrementar e depois utilizar usamos mais mais i (++i). De modo análogo, para utilizar e depois decrementar usamos i menos menos (i--). Para decrementar e depois utilizar usamos menos menos i (--i). Neste exemplo, mostraremos a diferença entre os vários operadores de incre- mento e decremento.

1 # include < iostream > 2 3 using namespace std ; 4 5 int main (){ 6 int x ;

7 x = 0; 8 cout << " x ￿ = ￿ " << x ++ << endl ; 9 cout << " x ￿ = ￿ " << x << endl ; 10 cout << " x ￿ = ￿ " << ++ x << endl ; 11 cout << " x ￿ = ￿ " << x << endl ; 12 cout << " x ￿ = ￿ " << x - - << endl ; 13 cout << " x ￿ = ￿ " << x << endl ; 14 cout << " x ￿ = ￿ " << --x << endl ; 15 cout << " x ￿ = ￿ " << x << endl ; 16 return 0; 17 }

Iniciamos com a criação de uma variável x na sexta linha do código. Esta variável x será inicializada em seguida com zero.

Na oitava linha, utilizamos um operador de incremento em uma variável que está sendo enviada para um cout. Como utilizamos o operador de pós-incremento (x++), a variável será pri- meiramente utilizada no comando cout. Imprimindo assim, seu resultado na tela.

x = 0

Apenas após sua utilização, ela é incrementada e passa a ter valor 1. No comando seguinte, simplesmente imprimimos o valor da variável x, que agora vale 1.

x = 0 x = 1

Agora na décima linha, utilizamos um operador de incremento prefixado (++x), onde x é incrementado e depois utilizado. Primeiramente, x é incremen- tado passando a valer 2. Em seguida, seu valor é impresso na tela.

x = 0 x = 1 x = 2

Na linha seguinte imprimimos novamente o valor de x: