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


Algoritmos e Lógica de Programação em C++: Exercícios e Exemplos, Resumos de Programação em C

APOSTILA SOBRE C++, exercicios, resumos e muito mais

Tipologia: Resumos

2019

Compartilhado em 30/09/2019

lucas-candido
lucas-candido 🇧🇷

1 documento

1 / 69

Toggle sidebar

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

Não perca as partes importantes!

bg1
Algoritmos e Lógica de Programação C++ Professor Esp. airton josé sachetim garcia
Departamento de Engenharia
Prof. Airton José Sachetim Garcia
Algoritmos e Lógica
de
Programação
Londrina
2015.2
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

Pré-visualização parcial do texto

Baixe Algoritmos e Lógica de Programação em C++: Exercícios e Exemplos e outras Resumos em PDF para Programação em C, somente na Docsity!

Departamento de Engenharia

Prof. Airton José Sachetim Garcia

Algoritmos e Lógica

de

Programação

Londrina

PROGRAMA DE GRADUAÇÃO EM ENGENHARIA

DEPARTAMENTO DE ENGENHARIA

Airton José Sachetim Garcia

C++

LONDRINA-PR

INTRODUÇÃO

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.6.1 Algumas bibliotecas do C++.

 <Math.h>

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.

1.7.1 Trigonométricas.

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.

1.7.2 Logarítmicas.

 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.

1.7.3 Potência.

 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.

1.8.1 Operadores Aritméticos.

1.8.1.1 Operadores aritméticos binários.

 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;

1.8.5 Operadores de incremento e decremento (++, --).

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.

1.8.6 Operadores relacionais e lógicos.

1.8.6.1 Relacionais.

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.

1.8.6.2 Lógicos.

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;

1.10.1 Saída.

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.

1.10.2 Entrada.

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ê

1.11.1 Decisão.

Os métodos de tomada de decisão no C++ estão presentes para as tarefas mais corriqueiras que o programa deve executar.

1.11.1.1 Estrutura IF/ELSE.

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: