Podemos usar também o printf para formatar dados de diversas formas também.
Vamos vê um exemplo, no qual usamos uma variável float com o PI:
#include <iostream>
#include <cstdio> // Para printf
#include <cmath> // Para a constante PI
using namespace std;
int main() {
float pi = M_PI;
printf("Valor de PI: %f", pi);
return 0;
}
PS: Observe que o PI foi retirado de uma constante (M_PI) de uma biblioteca do próprio programa.
Dessa forma, podemos usar a formatação do float, exibindo quantas casas decimais desejamos exibir, dessa forma:
printf("Valor de PI: %.2f", pi);
Para completar o número com zeros à esquerda, também é possível, veja um exemplo com int:
#include <iostream>
#include <cstdio> // Para printf
using namespace std;
int main() {
int num = 5;
printf("Valor de Num: %07d", num);
return 0;
}
No caso acima, o 0 indica o caractere a completar as casas "vazias" (só funciona com 0), e o segundo número (no caso, 7), indica a quantidade de casas decimais (incluindo o número exibido). Da mesma forma funciona com o float.
Existem inúmeras formatações para a maioria dos tipos de dados, usando números nas máscaras.
Sobre o cout, podemos usar atributos para converter dados também, veja um exemplo onde convertemos números para hexadecimal:
#include <iostream>
#include <cstdio> // Para printf
using namespace std;
int main() {
int num = 15;
cout << "Valor de Num em decimal: " << num << endl;
cout << "Valor de Num em hexadecimal: " << hex << num << endl;
cout << "Valor de Num em octal: " << oct << num << endl;
return 0;
}
No caso acima, bastou apenas colocar um atributo hex antes da variável para converter pra hexadecimal, e o oct para octal (se formos converter hexadecimal para decimal, usamos o dec).
Mas para converter octais e hexadecimais, é melhor usarmos um método (importe iomanip):
#include <iostream>
#include <cstdio> // Para printf
#include <iomanip> // Para setbase
using namespace std;
int main() {
int num = 15;
cout << "Valor de Num em decimal: " << num << endl;
cout << "Valor de Num em hexadecimal: " << setbase(16) << num << endl;
cout << "Valor de Num em octal: " << setbase(8) << num << endl;
return 0;
}
No caso acima, apenas precisamos passar o parâmetro de números, no caso, seria 8 para octal e 16 para hexadecimal.
Podemos também usar o precision para formatar casas decimais no cout, passando o número de casas pelo parâmetro, dessa forma:
#include <iostream>
#include <cstdio> // Para printf
#include <cmath> // Para a constante PI
using namespace std;
int main() {
float pi = M_PI;
cout.precision(3);
cout << "Valor de PI: " << pi << endl;
return 0;
}
PS: O ponto também é contado no precision, para exibir duas casas usamos o número 3. Se quiser voltar ao número de casas padrão do cout, basta colocar o precision novamente, com o número -1.
Podemos também usar o std::scientific para colocar os números em notação científica:
#include <iostream>
#include <cstdio> // Para printf
#include <cmath> // Para a constante PI
using namespace std;
int main() {
float pi = M_PI;
cout << "Valor de PI: " << scientific << pi << endl;
return 0;
}
Podemos usar também o setw para configurar a largura à esquerda (importe iomanip):
#include <iostream>
#include <iomanip> // Para setw
using namespace std;
int main() {
int num = 30;
cout << "Valor de num: " << setw(10) << num << endl;
return 0;
}
E para escolhermos o caractere que preencherá esses espaços, usamos o setfill(), dessa forma:
cout << "Valor de num: " << setw(10) << setfill('0') << num << endl;
Para converter tipos em C++, podemos fazer assim:
float real = 4.8;
int num = (int)real;
PS: Isso de colocar o tipo entre parênteses, é chamado de typecast, pode ser feito com qualquer tipo pra forçar uma conversão, mas só funciona quando é de tipos semelhantes (como forçar conversão de float para int, por exemplo).
No caso de const char*, podemos usar a função atoi pra isso (importe cstdlib):
const char* frase = "90";
int novo = atoi(frase);
Também podemos usar o strtol para converter const char* em int (em qualquer base numérica), dessa forma, sem necessitar de importação:
const char* frase = "90";
int novo = strtol(frase, NULL, 10); // O primeiro é a variável a ser convertida, o último número é a base numérica (no caso, a decimal)
Para converter int em const char*, usamos o sprintf assim:
int numero = 50;
char texto[10];
sprintf(texto, "%i", numero); // Sempre na ordem: Variável string a receber o valor, tipo de número convertido e o número.
printf("%s\n", texto);
PS: O sprintf também pode ser usado para concatenar variáveis de diferentes tipos numa variável só, por exemplo:
int hora = 10;
int minuto = 25;
char relogio[100];
sprintf(relogio, "A hora passada foi %.2d:%.2d.", hora, minuto);
printf("%s\n", relogio);
Antes de mais nada, não confunda vector com vetor, sendo que esse último é apenas o array unidimensional. O vector é sim como um "vetor moderno", mas ele é bem diferente de um array unidimensional.
Para criar um vector, importe a biblioteca vector
e declare a classe com o tipo e a variável, dessa forma:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num;
return 0;
}
Podemos adicionar o número de elementos também, dessa forma:
vector<int> num(5);
Ou seja, podemos definir o número de elementos ou simplemente não indicá-los, no segundo caso ele alocará dinamicamente a memória para os elementos
Para inserir elementos no final do vector, usamos o método push_back() (ou também emplace_back()), como visto abaixo:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num;
int tam;
int i;
num.push_back(10);
num.push_back(2);
num.push_back(5);
num.push_back(8);
tam = num.size();
cout << "Tamanho do vector: " << tam << endl;
for(i = 0; i < tam; i++) {
cout << num[i] << endl;
}
return 0;
}
No caso acima, usamos o método size() para retornar o tamanho do vector.
PS: Só podemos usar a sintaxe de array para exibir elementos de vector, para inserir dados dessa forma não funciona.
Agora, vamos criar dois vectores, dessa forma:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num1;
vector<int> num2;
int tam;
int i;
num1.push_back(1);
num1.push_back(2);
num1.push_back(3);
num1.push_back(4);
num2.push_back(5);
num2.push_back(6);
num2.push_back(7);
num2.push_back(8);
tam = num1.size();
for(i = 0; i < tam; i++) {
cout << num1[i] << endl;
}
cout << endl;
for(i = 0; i < tam; i++) {
cout << num2[i] << endl;
}
return 0;
}
Para trocar os valores de um vector para outro, usamos o elemento swap(), dessa forma:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num1;
vector<int> num2;
int tam;
int i;
num1.push_back(1);
num1.push_back(2);
num1.push_back(3);
num1.push_back(4);
num2.push_back(5);
num2.push_back(6);
num2.push_back(7);
num2.push_back(8);
num1.swap(num2);
tam = num1.size();
for(i = 0; i < tam; i++) {
cout << num1[i] << endl;
}
cout << endl;
for(i = 0; i < tam; i++) {
cout << num2[i] << endl;
}
return 0;
}
Pode ver que os elementos do vector num1 agora estão no num2 e vice-versa.
Para exibirmos o primeiro e o último elemento do vector, usamos respectivamente, os métodos front() e back(), assim:
cout << "Primeiro valor de num1: " << num1.front() << endl;
cout << "Último valor de num1..: " << num1.back() << endl;
Agora insira mais elementos no vector com o push_back() para ver que o último mudará.
Para pegar um valor específico, como o do meio, usamos o método at(), com o tamanho dentro, dessa forma:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num1;
vector<int> num2;
int tam;
int i;
num1.push_back(1);
num1.push_back(2);
num1.push_back(3);
num1.push_back(4);
num1.push_back(5);
num2.push_back(6);
num2.push_back(7);
num2.push_back(8);
num2.push_back(9);
num2.push_back(10);
cout << "Primeiro valor de num1: " << num1.front() << endl;
cout << "Último valor de num1..: " << num1.back() << endl;
cout << "Valor do meio.........: " << num1.at(num1.size() / 2) << endl;
tam = num1.size();
for(i = 0; i < tam; i++) {
cout << num1[i] << endl;
}
cout << endl;
for(i = 0; i < tam; i++) {
cout << num2[i] << endl;
}
return 0;
}
Para inserir elementos no vector, usamos o método insert, indicando a posição (no caso, com begin para o início):
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num1;
vector<int> num2;
int tam1, tam2;
int i;
num1.push_back(1);
num1.push_back(2);
num1.push_back(3);
num1.push_back(4);
num1.push_back(5);
num1.insert(num1.begin(), 888);
num2.push_back(6);
num2.push_back(7);
num2.push_back(8);
num2.push_back(9);
num2.push_back(10);
cout << "Primeiro valor de num1: " << num1.front() << endl;
cout << "Último valor de num1..: " << num1.back() << endl;
cout << "Valor do meio.........: " << num1.at(num1.size() / 2) << endl;
tam1 = num1.size();
tam2 = num2.size();
for(i = 0; i < tam1; i++) {
cout << num1[i] << endl;
}
cout << endl;
for(i = 0; i < tam2; i++) {
cout << num2[i] << endl;
}
return 0;
}
Para inserir na segunda posição, some 1 ao begin(), na terceira some 2, na quarta e assim por diante:
num1.insert(num1.begin() + 1, 888);
O end() insere na última posição, e pode ser usado para inserir na penúltima posição subtraindo 1, na antepenúltima subtraindo 2 e assim por diante:
num1.insert(num1.end() - 2, 888);
Para remover, usamos o método erase(), da mesma forma, assim:
num1.erase(num1.end() - 1);
Podemos também usar métodos como o pop_back() e o pop_front() para retirar elementos, veja um exemplo:
while(!num1.empty()) {
num1.pop_back();
}
cout << "Novo tamanho de num1: " << num1.size() << endl;
num2.clear();
Veja que o empty() verifica se o vector está vazio. Como visto acima, o clear() deleta todos os elementos, dispensando o uso de while para isso.
Para ordenar um vector, podemos fazer assim:
sort(num1.begin(), num1.end()); // Inclua algorithm
E pra ordenar de ordem reversa, fazemos assim:
sort(num1.begin(), num1.end()); // Inclua algorithm
reverse(num1.begin(), num1.end());
PS: Podemos usar o "for it" em vector e outros containers, por exemplo:
for(int n: num1) {
cout << n << endl;
}
Para verificar se um item existe num vector, use o método find de std, assim:
vector<int> num;
num.push_back(0);
num.push_back(1);
int item = 1;
if(find(num.begin(), num.end(), item) != num.end()) { // No lugar do item, coloque o item que você deseja verificar, inclua algorithm
cout << "O número " << item << " está no vector!" << endl;
}
else {
cout << "Número " << item << " não encontrado!" << endl;
}
PS: O método acima também funciona com listas.