-
Notifications
You must be signed in to change notification settings - Fork 79
Intro Cpp
O principal objetivo deste roteiro é retomar a prática de programação em C++ usando exercícios simples e que eventualmente sejam úteis para os projetos da disciplina. Os exercícios para entrega estarão indicados no fim do roteiro.
Em C usamos as funções printf
para mostrar dados no terminal e scanf
para ler dados. Em C++ essas funções também podem ser usadas, mas em geral são substituídas pelos objetos std::cin
e std::cout
(disponíveis no cabeçalho iostream
)
Para mostrar mensagens no terminal basta "enviar" dados para o objeto usando o operador <<
. Veja o exemplo abaixo.
int a = 10;
double b = 3.2;
std::cout << a << ";" << b << "\n";
Note que não precisamos mais usar a string de formatação cheia de %d
e afins. Basta ir aplicando <<
aos dados que queremos mostrar.
O mesmo vale para a entrada, mas desta vez "tiramos" os dados do objeto std::cin
. O exemplo abaixo lê um inteiro e um double
do terminal.
int a;
double b;
std::cin >> a >> b;
Crie um programa que lê um número inteiro n
e depois lê n
números fracionários e calcula a média entre eles.
Em C usamos as funções malloc
e free
para alocar memória dinamicamente. Em C++ essas funções também estão disponíveis, mas usá-las é considerado uma má prática. Ao invés, usamos os operadores new
e delete
para alocar memória.
point *p;
p = new point();
/* usar p aqui */
delete p;
Também podemos criar (e deletar) arrays de tamanho fixo usando new[]
e delete[]
.
int n;
std::cin >> n;
double *values = new double[n];
/* usar values aqui */
delete[] values;
Crie um programa que receba um inteiro n
e depois leia dois grupos de n
números fracionários. Seu programa deverá imprimir a distância euclidiana entre o primeiro e o segundo grupo de valores.
Durante todo o curso iremos trabalhar com medições de tempo.
Crie um script python que gere uma entrada muito grande (n=100000
) para o programa acima.
Use a ferramenta time
para medir o tempo de execução do programa. Escreva este valor abaixo. Você consegue dizer quanto tempo o cálculo da distância euclidiana leva?
Um dos problemas da utilização do comando time
é que ele não separa o tempo gasto para ler a entrada do programa e o tempo gasto no calculo da distância euclidiana. Felizmente a biblioteca padrão de C++ possui diversas classes para medição de tempo.
O cabeçalho <chrono>
disponibiliza diversas classes e funções para medição de tempo. Leia sua documentação neste link e responda:
- Qual classe você usaria para obter leituras de tempo com a melhor precisão possível? Quais métodos ou funções desta classe seriam úteis?
- Para que servem as classes
time_point
eduration
?
Use as classes acima para medir o tempo de execução do cálculo da distância euclidiana no exemplo anterior. Escreva abaixo o tempo gasto em milisegundos.
Vamos iniciar nosso curso com uma comparação de desempenho de funções matemáticas. Seu trabalho será:
- criar uma função
gera_vetor
que recebe um inteiron
e devolve um vetor de dados aleatório de tamanhon
com tipodouble
. - criar funções
log
,sqrt
,pow3
(usando a bibliotecamath
) epow3mult
(usando o operador*
duas vezes) que computam as operações correspondentes em cada elemento do vetor. - criar uma função
sum
que calcula a soma do vetor. - criar um
main
que cria vetores de tamanho incrementalmente maior e computa o tempo necessário para cada função rodar.
Gere um gráfico mostrando as diferenças de desempenho.