-
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_pointeduration?
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_vetorque recebe um inteirone devolve um vetor de dados aleatório de tamanhoncom 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
sumque calcula a soma do vetor. - criar um
mainque 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.